Regression Simulations

linear

enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r

enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r

enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r

enhancer

ccle_rnaseq

juvenile

splicing

Classification Simulations

logistic

enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r_logistic

enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r_logistic

enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r_logistic

enhancer

ccle_rnaseq

juvenile

splicing

Robust Simulations

linear

enhancer

Mean Shift = 10

Mean Shift = 25

ccle_rnaseq

Mean Shift = 10

Mean Shift = 25

lss_3m_2r

enhancer

Mean Shift = 10

Mean Shift = 25

ccle_rnaseq

Mean Shift = 10

Mean Shift = 25

hier_poly_3m_2r

enhancer

Mean Shift = 10

Mean Shift = 25

ccle_rnaseq

Mean Shift = 10

Mean Shift = 25

linear_lss_3m_2r

enhancer

Mean Shift = 10

Mean Shift = 25

ccle_rnaseq

Mean Shift = 10

Mean Shift = 25

Correlation Bias Simulations

Main Figures

PVE = 0.1

PVE = 0.4

Number of RF Splits

Appendix Figures

PVE = 0.1

PVE = 0.4

Entropy Bias Simulations

Main Figures

Average Rank

Number of RF Splits

Appendix Figures

Average Rank

CCLE Case Study

Summary

Table of Top Genes

GMDI (ridge) MDI TreeSHAP MDI-oob MDA
17-AAG
1 MMP24 (1.03) MMP24 (1.06) MMP24 (1.12) MMP24 (1.28) MMP24 (1.47)
2 NQO1 (2.62) NQO1 (2.72) NQO1 (2.72) NQO1 (9.47) NQO1 (2.38)
3 ENSG00000261602 (2.84) ENSG00000261602 (3.38) ENSG00000261602 (3) PCSK1N (205.19) ENSG00000261602 (2.5)
4 PCSK1N (4.94) PCSK1N (5.69) PCSK1N (6.31) CGNL1 (342.66) PCSK1N (19.53)
5 OGDHL (6.78) SH3BP1 (8.69) SH3BP1 (7.5) CDH6 (368.28) OGDHL (35.44)
AEW541
1 TXNDC5 (1.12) TXNDC5 (1.31) TXNDC5 (1.81) TXNDC5 (1.34) TXNDC5 (1.22)
2 TNFRSF17 (2.5) ATP8B2 (2.5) ATP8B2 (4.59) TNFRSF17 (3.66) TNFRSF17 (2.56)
3 ATP8B2 (2.75) TNFRSF17 (2.56) TNFRSF17 (4.94) ATP8B2 (122.84) ATP8B2 (3.28)
4 IQGAP2 (5.94) LHFPL2 (10.44) TCEAL4 (5.25) TMEM101 (164.28) LHFPL2 (5.66)
5 LHFPL2 (7.19) IQGAP2 (16.09) IQGAP2 (7.44) TCEAL4 (188.97) IQGAP2 (14.81)
AZD0530
1 VTN (1.97) PRSS57 (3.69) VTN (1.78) VTN (2.16) VTN (124.34)
2 PRSS57 (6.28) VTN (3.84) SYTL1 (8.53) ITGB6 (87.03) SORBS1 (219.27)
3 ITGB6 (7.53) FDFT1 (20.38) ITGB6 (9.62) SYTL1 (163.72) PRSS57 (326.84)
4 SYTL1 (9.19) ITGB6 (22.19) PRSS57 (21.69) STXBP1 (487.53) SLC16A9 (345.5)
5 THEM4 (10.59) SYTL1 (26.56) CLDN16 (36.88) CLDN16 (501.41) SYTL1 (360.81)
AZD6244
1 SPRY2 (1.59) RNF125 (2.47) ETV4 (3.16) LYZ (2.88) SPRY2 (2.38)
2 LYZ (2.97) LYZ (2.91) SPRY2 (3.5) RNF125 (3) RNF125 (3.38)
3 RNF125 (3.19) ENSG00000257764 (4.19) RNF125 (3.72) SPRY2 (3.97) LYZ (4.31)
4 ENSG00000257764 (4.03) SPRY2 (4.34) TOR4A (4.72) GJB1 (5) ETV4 (5.41)
5 ETV4 (4.97) GJB1 (5.06) KLF3 (5.84) ENSG00000257764 (6.5) GJB1 (5.5)
Erlotinib
1 SYTL1 (2) CDH3-AS1 (2) SYTL1 (1.53) CDH3 (1.97) SYTL1 (2.53)
2 CDH3 (2.06) CDH3 (2.06) CDH3 (2.34) SYTL1 (2.12) CDH3 (2.72)
3 CDH3-AS1 (2.22) SYTL1 (3.09) CDH3-AS1 (2.94) CDH3-AS1 (2.66) CDH3-AS1 (2.94)
4 EGFR (5.78) EGFR (5.72) GJB3 (6.19) GJB3 (17.25) GJB3 (12.97)
5 GJB3 (6.81) GJB3 (11.62) EGFR (13.75) EGFR (20.75) EGFR (15.81)
Irinotecan
1 SLFN11 (1) SLFN11 (1.28) SLFN11 (1) SLFN11 (1.19) SLFN11 (1.03)
2 PPIC (2.44) PPIC (2.41) PPIC (2.75) PPIC (2.69) PPIC (2.62)
3 PPIC-AS1 (3.31) PPIC-AS1 (3.25) S100A16 (3.16) PPIC-AS1 (3.09) S100A16 (3.19)
4 S100A16 (3.69) S100A16 (3.28) PPIC-AS1 (3.41) S100A16 (3.38) PPIC-AS1 (3.25)
5 AGAP2 (5.44) AGAP2 (6.97) AGAP2 (6.47) AGAP2 (7.66) AGAP2 (9.38)
L-685458
1 DEF6 (2) DEF6 (2.12) DEF6 (2.28) DEF6 (1.84) ENSG00000257824 (5.22)
2 ENSG00000257824 (5.44) ENSG00000257824 (6.47) ENSG00000257824 (6.22) ENSG00000257824 (6.69) DEF6 (7.09)
3 PPIC-AS1 (9.38) PPIC-AS1 (21.34) PPIC-AS1 (14.66) RASAL3 (24.16) PPIC-AS1 (16.44)
4 RASAL3 (11.12) P2RX1 (48.66) CTNNA1 (43.38) LAIR1 (59.62) CTNNA1 (29.81)
5 P2RX1 (16.88) RASAL3 (53.22) RASAL3 (46.5) IKZF1 (90.12) LAIR1 (64.72)
LBW242
1 IGSF3 (1.09) IGSF3 (1.78) IGSF3 (3.53) SERPINB6 (170.56) IGSF3 (1.84)
2 HERC5 (3.81) SH3RF1 (5.06) SERPINB6 (5.12) PINLYP (188.59) IL1R2 (9.19)
3 GBP1 (4.78) GBP1 (5.16) HERC5 (5.94) RGS14 (219.16) SERPINB6 (17)
4 CXCL1 (5.22) RGS14 (8.22) CXCL1 (8.22) GBP1 (323.72) GBP1 (173.62)
5 IL1R2 (5.97) IL1R2 (8.56) GBP1 (9.34) IGSF3 (341.22) CXCL1 (293.03)
Lapatinib
1 ERBB2 (1.22) ERBB2 (1.38) ERBB2 (1.41) ERBB2 (1.34) PGAP3 (1.81)
2 PGAP3 (1.97) PGAP3 (1.91) PGAP3 (5.31) PGAP3 (2.62) ERBB2 (1.94)
3 GRB7 (3.06) GRB7 (3.31) ENSG00000152022 (5.47) GRB7 (4) GRB7 (4.16)
4 ENSG00000152022 (4.62) ENSG00000152022 (4.78) FAM83H (6.53) ENSG00000152022 (5.09) ENSG00000152022 (5.16)
5 EPHA1 (7.66) IKBIP (9) EPHA1 (7.78) FAM83H (8.91) EPHA1 (10.47)
Nilotinib
1 TRDC (1.56) TRDC (1.94) TRDC (2.56) PRSS57 (2) TRDC (1.47)
2 PRSS57 (2.41) CISH (2.62) PRSS57 (2.69) TRDC (3.97) PRSS57 (2.69)
3 CISH (2.94) PRSS57 (2.81) CISH (3.56) NRROS (6.47) CISH (3.62)
4 SPN (5.84) SPN (6.53) NRROS (7.78) SPN (14.25) NRROS (10.03)
5 NRROS (6.09) NRROS (11.09) SPN (8.25) KLF13 (15.94) SOCS2 (14.94)
Nutlin-3
1 ITGAL (3.91) ENSG00000255518 (3.22) MDM2 (1.22) MDM2 (6.09) ENSG00000255518 (4.66)
2 ENSG00000255518 (4) ITGAL (4.25) RPS27L (9.25) ADD3 (49.31) ITGAL (8.28)
3 MDM2 (5.31) ENSG00000261346 (5) DDB2 (10) DDB2 (94.78) ENSG00000261346 (10.69)
4 ENSG00000261346 (5.47) MDM2 (10.22) ITGAL (12.31) ENSG00000261346 (166.88) ENSG00000261332 (178.94)
5 C16orf54 (9.12) ENSG00000261332 (18.41) ENSG00000255518 (14.44) ITGAL (168.94) TP53INP1 (195.06)
PD-0325901
1 ETV4 (1.03) ETV4 (1.56) ETV4 (1) ETV4 (1.06) ETV4 (1.06)
2 SPRY2 (2.31) GJB1 (3.19) SPRY2 (4.16) GJB1 (4.16) SPRY2 (3.19)
3 GJB1 (4.62) SPRY2 (4.97) TOR4A (4.41) SPRY2 (5.03) TOR4A (5.03)
4 RNF125 (4.94) RNF125 (5.66) KLF3 (5.62) ENSG00000257764 (6.34) GJB1 (5.59)
5 ENSG00000257764 (5.81) ENSG00000257764 (6.47) GJB1 (5.97) KLF3 (7.38) KLF3 (7.41)
PD-0332991
1 PPIC-AS1 (2.19) PPIC-AS1 (2.78) PPIC-AS1 (2.19) PPIC-AS1 (2.56) PPIC-AS1 (1.84)
2 ENSG00000234648 (2.53) ENSG00000234648 (2.94) ENSG00000234648 (2.62) ENSG00000234648 (2.94) ENSG00000234648 (2.38)
3 PPIC (4.16) SH2D3C (5.06) PPIC (4.22) PPIC (4.12) PPIC (3.22)
4 SH2D3C (4.78) PPIC (5.28) SH2D3C (6.94) SH2D3C (5.16) SH2D3C (6.97)
5 AGAP2 (11.25) TRAF3IP3 (12.03) AGAP2 (11.34) TRAF3IP3 (11.22) RPL32P29 (31.56)
PF2341066
1 ENAH (1.09) ENAH (1.72) ENAH (1) ENAH (1.12) ENAH (1.16)
2 SELPLG (2.16) SELPLG (2) SELPLG (2.25) SELPLG (2.12) SELPLG (2.09)
3 MET (2.94) MET (2.38) HGF (3.22) MET (4.03) MET (2.97)
4 HGF (4.38) HGF (5.78) MET (4.19) DOK2 (4.56) HGF (5.72)
5 DOK2 (5.44) DOK2 (6.19) DOK2 (5.97) HGF (6.47) DOK2 (6.22)
PHA-665752
1 ARHGAP4 (1) ARHGAP4 (1) ARHGAP4 (1) ARHGAP4 (1) ARHGAP4 (1)
2 FMNL1-AS1 (2.75) FMNL1-AS1 (3.44) FMNL1-AS1 (2.41) FMNL1-AS1 (2.56) FMNL1-AS1 (2.59)
3 FMNL1 (3.69) FMNL1 (5.75) FMNL1 (3.12) FMNL1 (4.81) FMNL1 (4.59)
4 PGPEP1 (5.75) PGPEP1 (7.91) PGPEP1 (5.81) PGPEP1 (6.91) ACAP1 (9.62)
5 HEY1 (13.88) FDFT1 (12.09) HEY1 (18.69) HEY1 (27.72) HEY1 (12.03)
PLX4720
1 RXRG (1.34) RXRG (1.78) MMP8 (2.34) RXRG (2.16) RXRG (2)
2 MMP8 (3.09) MMP8 (3.25) RXRG (2.59) MMP8 (2.69) MMP8 (2.69)
3 ENSG00000227297 (4.5) LYST (3.75) LYST (3.88) LYST (5.44) LYST (5.22)
4 LYST (5.09) ENSG00000256673 (7.16) ENSG00000256673 (7.41) ENSG00000256673 (6.84) PLP1 (6.81)
5 ENSG00000256673 (6.59) PLP1 (8.72) PLP1 (9.38) UCN2 (9.62) UCN2 (7.84)
Paclitaxel
1 MMP24 (1.19) MMP24 (1.25) MMP24 (1.09) MMP24 (1.41) MMP24 (1.28)
2 AGAP2 (1.88) AGAP2 (1.78) AGAP2 (2.06) AGAP2 (2.47) AGAP2 (2.38)
3 BCL2L1 (3.31) BCL2L1 (4.47) BCL2L1 (3.72) SH3BP1 (13.28) PTPN7 (4.25)
4 ABCB1 (5.12) PTPN7 (7.72) P3H3 (5.81) POLR3G (33.34) BCL2L1 (5)
5 SH3BP1 (7.28) P3H3 (8.22) SH3BP1 (6.94) BCL2L1 (71.31) P3H3 (6.53)
Panobinostat
1 AGAP2 (1.12) AGAP2 (1.31) AGAP2 (1.31) AGAP2 (1.5) AGAP2 (1.44)
2 CCN1 (1.91) CCN1 (1.72) CCN1 (1.69) CCN1 (1.84) CCN1 (1.78)
3 MYOF (4.44) RPL39P5 (4.47) MYOF (4.31) WWTR1 (7.09) RPL39P5 (4.59)
4 RPL39P5 (4.69) WWTR1 (4.78) RPL39P5 (5.28) MYOF (14.97) WWTR1 (5.28)
5 WWTR1 (4.97) AMOTL2 (6.16) WWTR1 (5.69) FTH1P23 (72.56) MYOF (6.22)
RAF265
1 SYT17 (1.88) SYT17 (2.5) SYT17 (1.34) SYT17 (4.69) SYT17 (2.84)
2 EMILIN2 (3.19) EMILIN2 (5.75) SH2B3 (6.41) SH2B3 (58.62) STAT5A (11.09)
3 STAT5A (6.22) STAT5A (6.59) SLC29A3 (7.66) STAT5A (69.56) SH2B3 (21.03)
4 SH2B3 (6.56) SLC29A3 (12.06) EMILIN2 (8.16) CMTM3 (76.38) SLC29A3 (23.28)
5 RGS10 (8.47) SH2B3 (12.16) STAT5A (8.97) EMILIN2 (310.97) EPHA3 (25.22)
Sorafenib
1 SPNS3 (1.53) SPNS3 (2.28) TP63 (1.81) SPNS3 (2.25) SPNS3 (1.66)
2 LAIR1 (9.78) ENSG00000273055 (13.78) SPNS3 (4.62) TP63 (19.12) ENSG00000273055 (20.09)
3 ENSG00000273055 (11.59) TP63 (25.81) ENSG00000273055 (13.22) SELPLG (32.88) TP63 (26.78)
4 P2RX1 (13.66) P2RX1 (27.41) FAM117A (20.84) FAM117A (37.03) FAM117A (34.47)
5 TWF1 (13.81) TWF1 (33.34) P2RX1 (26.38) TWF1 (37.56) ABCB6 (49.06)
TAE684
1 SELPLG (1) SELPLG (1) SELPLG (1) SELPLG (1) SELPLG (1)
2 LAIR1 (4.44) NFIL3 (4.28) ARID3A (5.75) LAIR1 (6.19) LAIR1 (5.47)
3 NFIL3 (4.69) FMNL1-AS1 (6.12) LAIR1 (7.97) FMNL1-AS1 (10.66) NFIL3 (5.75)
4 ARID3A (4.91) LAIR1 (6.41) FMNL1-AS1 (8.41) CPXM1 (11.66) CPXM1 (7.78)
5 FMNL1-AS1 (6.16) PRDM1 (9.69) CPXM1 (10.41) ARID3A (13.84) FMNL1-AS1 (9.03)
TKI258
1 TWF1 (1.03) TWF1 (1.19) TWF1 (1.09) TWF1 (1.03) TWF1 (1.03)
2 PRSS57 (4.72) PRSS57 (7.03) GPR162 (11.19) GPR162 (72.91) LAT2 (7.5)
3 LAT2 (7.88) LAT2 (8.03) P3H3 (12.34) P3H3 (89.69) PRSS57 (16.5)
4 C16orf54 (12.09) C16orf54 (17.56) PRSS57 (27.19) CFL2 (125.95) CFL2 (113.02)
5 GPX7 (16.56) GPX7 (26.34) LAT2 (28.59) PCDH1 (179.09) SPN (154.38)
Topotecan
1 SLFN11 (1) SLFN11 (1) SLFN11 (1) SLFN11 (1) SLFN11 (1)
2 PPIC (2.31) PPIC (2.44) PPIC (2.75) PPIC (2.66) PPIC (2.5)
3 PPIC-AS1 (3.19) PPIC-AS1 (3.44) S100A16 (3.81) PPIC-AS1 (3.28) PPIC-AS1 (3.16)
4 S100A16 (5.03) S100A16 (4.16) PPIC-AS1 (3.81) S100A16 (4.06) S100A16 (4.44)
5 HMGB2 (6.25) OSGIN1 (6.41) OSGIN1 (5.81) OSGIN1 (7.31) RASAL3 (6.06)
ZD-6474
1 DYNLT3 (4.12) MAP3K12 (6.72) MAP3K12 (4.5) MAP3K12 (9.47) TIMP1 (14.59)
2 MAP3K12 (4.75) CTSH (13.56) DYNLT3 (5.31) DYNLT3 (23.91) DYNLT3 (26.09)
3 PIM1 (8.47) DYNLT3 (14.28) TIMP1 (9.25) TIMP1 (172.03) CTSH (27.59)
4 CTSH (11) PIM1 (15.19) SCD5 (14.66) DLG4 (232) DLG4 (56)
5 DLG4 (12.72) DLG4 (15.66) CTSH (15.38) ITGA10 (258.05) SLC16A9 (58.06)

17-AAG

AEW541

AZD0530

AZD6244

Erlotinib

Irinotecan

L-685458

LBW242

Lapatinib

Nilotinib

Nutlin-3

PD-0325901

PD-0332991

PF2341066

PHA-665752

PLX4720

Paclitaxel

Panobinostat

RAF265

Sorafenib

TAE684

TKI258

Topotecan

ZD-6474

TCGA BRCA Case Study

Non-zero Stability Scores Per Method

Stability of Top Features

Table of Top Genes

Rank GMDI (ridge) GMDI (logistic) MDA TreeSHAP MDI
1 ESR1 (1.66) ESR1 (1.78) ESR1 (4.56) ESR1 (6.56) TPX2 (12.31)
2 FOXA1 (3.34) GATA3 (4.84) FOXA1 (5.62) TPX2 (7.97) ESR1 (14.38)
3 FOXC1 (4.44) TPX2 (5.03) GATA3 (5.69) FOXA1 (15.22) FOXA1 (21.94)
4 GATA3 (6.12) FOXA1 (5.88) MLPH (6.19) GATA3 (16.31) FOXM1 (24.22)
5 AGR3 (7.19) FOXC1 (8.09) TPX2 (7.47) FOXM1 (16.88) GATA3 (24.66)
6 MLPH (8.22) MLPH (10.91) FOXM1 (13.55) MLPH (19.16) MLPH (26.75)
7 TPX2 (8.59) AGR3 (10.94) AGR3 (13.78) CDK1 (21.75) CDK1 (28.84)
8 FOXM1 (19.41) FOXM1 (11.12) FOXC1 (14.62) AGR3 (24.06) FOXC1 (31.41)
9 TBC1D9 (20.44) UBE2C (14.47) TBC1D9 (16.47) MYBL2 (24.22) TBC1D9 (31.72)
10 SFRP1 (21.28) MYBL2 (20.47) KIF2C (22.41) FOXC1 (26.66) AGR3 (31.91)

Misspecified Models

linear

enhancer

ccle_rnaseq

juvenile

splicing

lss_3m_2r

enhancer

ccle_rnaseq

juvenile

splicing

hier_poly_3m_2r

enhancer

ccle_rnaseq

juvenile

splicing

linear_lss_3m_2r

enhancer

ccle_rnaseq

juvenile

splicing

Varying Sparsity

linear

juvenile

splicing

lss_3m_2r

juvenile

splicing

hier_poly_3m_2r

juvenile

splicing

linear_lss_3m_2r

juvenile

splicing

Varying # Features

linear

ccle_rnaseq

lss_3m_2r

ccle_rnaseq

hier_poly_3m_2r

ccle_rnaseq

linear_lss_3m_2r

ccle_rnaseq

GMDI Modeling Choices

linear

enhancer

min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq

min_samples_per_leaf = 5

min_samples_per_leaf = 1

hier_poly_3m_2r

enhancer

min_samples_per_leaf = 5

min_samples_per_leaf = 1

ccle_rnaseq

min_samples_per_leaf = 5

min_samples_per_leaf = 1

LS0tCnRpdGxlOiAiR01ESSBTaW11bGF0aW9uIFJlc3VsdHMgU3VtbWFyeSIKYXV0aG9yOiAiIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlZCwgJVknKWAiCm91dHB1dDogdnRoZW1lczo6dm1vZGVybgpwYXJhbXM6CiAgcmVzdWx0c19kaXI6IAogICAgbGFiZWw6ICJSZXN1bHRzIGRpcmVjdG9yeSIKICAgIHZhbHVlOiAiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9yZXN1bHRzX2ZpbmFsLyIKICBzZWVkOgogICAgbGFiZWw6ICJTZWVkIgogICAgdmFsdWU6IDEyMzQ1CiAgZm9yX3BhcGVyOgogICAgbGFiZWw6ICJFeHBvcnQgcGxvdHMgZm9yIHBhcGVyIgogICAgdmFsdWU6IEZBTFNFCiAgdXNlX2NhY2hlZDoKICAgIGxhYmVsOiAiVXNlIGNhY2hlZCAucmRzIGZpbGVzIgogICAgdmFsdWU6IFRSVUUKICBpbnRlcmFjdGl2ZToKICAgIGxhYmVsOiAiSW50ZXJhY3RpdmUgcGxvdHMiCiAgICB2YWx1ZTogRkFMU0UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KHBhdGNod29yaykKY2h1bmtfaWR4IDwtIDEKCiMgc2V0IHBhcmFtZXRlcnMKcmVzdWx0c19kaXIgPC0gcGFyYW1zJHJlc3VsdHNfZGlyCnNlZWQgPC0gcGFyYW1zJHNlZWQKZmlndXJlc19kaXIgPC0gZmlsZS5wYXRoKCJmaWd1cmVzIikKaWYgKCFkaXIuZXhpc3RzKGZpbGUucGF0aChmaWd1cmVzX2RpciwgImFwcGVuZGl4IikpKSB7CiAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIpLCByZWN1cnNpdmUgPSBUUlVFKQp9CgojIG1pc2NlbGxhbmVvdXMgaGVscGVyIHZhcmlhYmxlcwpoZXJpdGFiaWxpdGllcyA8LSBjKDAuMSwgMC4yLCAwLjQsIDAuOCkKZnJhY19sYWJlbF9jb3JydXB0aW9ucyA8LSBjKCIwLjI1IiwgIjAuMTUiLCAiMC4wNSIsICIwIikKY29ycnVwdF9zaXplcyA8LSBjKDAuMDUsIDAuMDI1LCAwLjAxLCAwKQptZWFuX3NoaWZ0cyA8LSBjKDEwLCAyNSkKbWV0cmljIDwtICJyb2NhdWMiCgojIHBsb3Qgb3B0aW9ucwpwb2ludF9zaXplIDwtIDIKbGluZV9zaXplIDwtIDEKZXJyYmFyX3dpZHRoIDwtIDAKaWYgKHBhcmFtcyRpbnRlcmFjdGl2ZSkgewogIHBsb3RfZnVuIDwtIHBsb3RseTo6Z2dwbG90bHkKfSBlbHNlIHsKICBwbG90X2Z1biA8LSBmdW5jdGlvbih4KSB4Cn0KCm1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXMgPC0gYygKICAiYmxhY2siLCAiYmxhY2siLCAiIzlCNURGRiIsICJibHVlIiwKICAib3JhbmdlIiwgIiM3MWJlYjciLCAiIzIxOGExZSIsICIjY2MzMzk5IgopCnNob3dfbWV0aG9kc19jaG9pY2VzIDwtIGMoCiAgIkdNRElfcmlkZ2VfUkYiLCAiR01ESV9yaWRnZV9sb29fcjJfUkYiLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzX1JGIiwgIkdNRElfSHViZXJfbG9vX2h1YmVyX2xvc3NfUkYiLAogICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiCikKbWV0aG9kX2xhYmVsc19jaG9pY2VzIDwtIGMoCiAgIkdNREkgKHJpZGdlKSIsICJHTURJIChyaWRnZSkiLCAiR01ESSAobG9naXN0aWMpIiwgIkdNREkgKEh1YmVyKSIsCiAgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIKKQpjb2xvcl9kZiA8LSB0aWJibGU6OnRpYmJsZSgKICBjb2xvciA9IG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXMsCiAgbmFtZSA9IHNob3dfbWV0aG9kc19jaG9pY2VzLAogIGxhYmVsID0gbWV0aG9kX2xhYmVsc19jaG9pY2VzCikKCm1hbnVhbF9jb2xvcl9wYWxldHRlX2FsbCA8LSBOVUxMCnNob3dfbWV0aG9kc19hbGwgPC0gTlVMTAptZXRob2RfbGFiZWxzX2FsbCA8LSBnZ3Bsb3QyOjp3YWl2ZXIoKQoKY3VzdG9tX3RoZW1lIDwtIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gInBsYWluIiksCiAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpCiAgIyBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJwbGFpbiIsIGhqdXN0ID0gMC41KQopCmN1c3RvbV90aGVtZV93aXRoX2xlZ2VuZCA8LSB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAicGxhaW4iKSwKICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgbGVnZW5kLnRleHQuYWxpZ24gPSAwLAogIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkKKQpjdXN0b21fdGhlbWVfd2l0aG91dF9sZWdlbmQgPC0gdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gInBsYWluIiksCiAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICBsZWdlbmQudGV4dC5hbGlnbiA9IDAsCiAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKQopCgpmaWdfaGVpZ2h0IDwtIDYKZmlnX3dpZHRoIDwtIDEwCgpzb3VyY2UoIi4uLy4uL3NjcmlwdHMvdml6LlIiLCBjaGRpciA9IFRSVUUpCmBgYAoKCiMgUmVncmVzc2lvbiBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMSkpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuMzUpCgp2YXJ5X3BhcmFtX25hbWUgPC0gImhlcml0YWJpbGl0eV9zYW1wbGVfcm93X24iCnlfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQp4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIsICJzcGxpY2luZyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJzcGxpY2luZyIsICJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoInNwbGljaW5nIiwgImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxpbmVhcl9sc3NfM21fMnIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICBzaW1fdGl0bGUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgeF9tb2RlbCA9PSAiY2NsZV9ybmFzZXEiIH4gIkNDTEUiLAogICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICB4X21vZGVsID09ICJlbmhhbmNlciIgfiAiRW5oYW5jZXIiLAogICAgICB4X21vZGVsID09ICJqdXZlbmlsZSIgfiAiSnV2ZW5pbGUiCiAgICApCiAgICBtZXRyaWNfbmFtZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBtZXRyaWMgPT0gInJvY2F1YyIgfiAiQVVST0MiLAogICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICkKICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLnJlZ3Jlc3Npb25fc2ltcy4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLCAKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgKQogICAgICAgIGlmIChoICE9IGhlcml0YWJpbGl0aWVzWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gaGVyaXRhYmlsaXRpZXNbbGVuZ3RoKGhlcml0YWJpbGl0aWVzKV0pICYgCiAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAoeV9tb2RlbCAlaW4lIGtlZXBfbGVnZW5kX3lfbW9kZWxzKSkpIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjpndWlkZXMoY29sb3IgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKQogICAgICAgIH0KICAgICAgICBwbHRfbHNbW2FzLmNoYXJhY3RlcihoKV1dIDwtIHBsdAogICAgICB9CiAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKAogICAgICAgIGZpbGUucGF0aChmaWd1cmVzX2Rpciwgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG1ldHJpYykpLAogICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICApICsKICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICB0aXRsZSA9IHNwcmludGYoIiVzIiwgc2ltX3RpdGxlKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMykKICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgIH0KICB9Cn0KCmBgYAoKCiMgQ2xhc3NpZmljYXRpb24gU2ltdWxhdGlvbnMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJHTURJX2xvZ2lzdGljX2xvZ2xvc3NfUkYiLCAiTURBX1JGIiwgIk1ESV9SRiIsICJNREktb29iX1JGIiwgIlRyZWVTSEFQX1JGIikKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gY29sb3JfZGYkY29sb3Jba2VlcF9tZXRob2RzXQpzaG93X21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZVtrZWVwX21ldGhvZHNdCm1ldGhvZF9sYWJlbHMgPC0gY29sb3JfZGYkbGFiZWxba2VlcF9tZXRob2RzXQphbHBoYV92YWx1ZXMgPC0gYygxLCAxLCByZXAoMC40LCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSAyKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC43MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJmcmFjX2xhYmVsX2NvcnJ1cHRpb25fc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsb2dpc3RpYyIsICJsc3NfM21fMnJfbG9naXN0aWMiLCAiaGllcl9wb2x5XzNtXzJyX2xvZ2lzdGljIiwgImxpbmVhcl9sc3NfM21fMnJfbG9naXN0aWMiKQp4X21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJjY2xlX3JuYXNlcSIsICJqdXZlbmlsZSIsICJzcGxpY2luZyIpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJlbmhhbmNlciIsICJqdXZlbmlsZSIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImp1dmVuaWxlIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibG9naXN0aWMiLCAibGluZWFyX2xzc18zbV8ycl9sb2dpc3RpYyIpCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgXG5cbiIsIHhfbW9kZWwpKQogICAgcGx0X2xzIDwtIGxpc3QoKQogICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwIiwgeF9tb2RlbCwgeV9tb2RlbCkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgKQogICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoImdtZGkuY2xhc3NpZmljYXRpb25fc2ltcy4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gZnJhY19sYWJlbF9jb3JydXB0aW9ucykgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgZHBseXI6OmZpbHRlcihmcmFjX2xhYmVsX2NvcnJ1cHRpb25fbmFtZSA9PSAhIWgpICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBmcmFjX2xhYmVsX2NvcnJ1cHRpb25zWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoeF9tb2RlbCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICB9CiAgICAgICAgaWYgKCEoKGggPT0gZnJhY19sYWJlbF9jb3JydXB0aW9uc1tsZW5ndGgoZnJhY19sYWJlbF9jb3JydXB0aW9ucyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoImNsYXNzaWZpY2F0aW9uX3NpbXNfJXNfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgcGxvdCA9IHBsdCwgdW5pdHMgPSAiaW4iLCB3aWR0aCA9IDE0LCBoZWlnaHQgPSBoZWlnaHQKICAgICAgKQogICAgfSBlbHNlIHsKICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgIGZhY2V0X3N0ciA9ICJmcmFjX2xhYmVsX2NvcnJ1cHRpb25fbmFtZSIsCiAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZQogICAgICAgICkgKwogICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICB4ID0gIlNhbXBsZSBTaXplIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQpgYGAKCgojIFJvYnVzdCBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0Ka2VlcF9tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWUgJWluJSBjKCJHTURJX3JpZGdlX2xvb19yMl9SRiIsICJHTURJX0h1YmVyX2xvb19odWJlcl9sb3NzX1JGIiwgIk1EQV9SRiIsICJNRElfUkYiLCAiTURJLW9vYl9SRiIsICJUcmVlU0hBUF9SRiIpCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGNvbG9yX2RmJGNvbG9yW2tlZXBfbWV0aG9kc10Kc2hvd19tZXRob2RzIDwtIGNvbG9yX2RmJG5hbWVba2VlcF9tZXRob2RzXQptZXRob2RfbGFiZWxzIDwtIGNvbG9yX2RmJGxhYmVsW2tlZXBfbWV0aG9kc10KYWxwaGFfdmFsdWVzIDwtIGMoMSwgMSwgcmVwKDAuNCwgbGVuZ3RoKG1ldGhvZF9sYWJlbHMpIC0gMikpCmxlZ2VuZF9wb3NpdGlvbiA8LSBjKDAuNzMsIDAuNCkKCnZhcnlfcGFyYW1fbmFtZSA8LSAiY29ycnVwdF9zaXplX3NhbXBsZV9yb3dfbiIKeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiLCAibGluZWFyX2xzc18zbV8yciIpCnhfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikKCnJlbW92ZV94X2F4aXNfbW9kZWxzIDwtIGMoMTApCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIiwgImNjbGVfcm5hc2VxIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIiwgImxpbmVhcl9sc3NfM21fMnIiKQprZWVwX2xlZ2VuZF9tZWFuX3NoaWZ0cyA8LSBjKDEwKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1jaXJjbGV9IFxuXG4iLCB4X21vZGVsKSkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgKQogICAgZm9yIChtZWFuX3NoaWZ0IGluIG1lYW5fc2hpZnRzKSB7CiAgICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyBNZWFuIFNoaWZ0ID0gJXMgXG5cbiIsIG1lYW5fc2hpZnQpKQogICAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzXyVzTVNfcm9idXN0X2RncCIsIHhfbW9kZWwsIHlfbW9kZWwsIG1lYW5fc2hpZnQpCiAgICAgIGZuYW1lIDwtIGZpbGUucGF0aChyZXN1bHRzX2RpciwgcGFzdGUwKCJnbWRpLnJvYnVzdF9zaW1zLiIsIHNpbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgICBpZiAoZmlsZS5leGlzdHMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKSAmIHBhcmFtcyR1c2VfY2FjaGVkKSB7CiAgICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICAgIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICAgICAgdG1wIDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvcnJ1cHRfc2l6ZV9uYW1lICVpbiUgY29ycnVwdF9zaXplcywKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kICVpbiUgc2hvd19tZXRob2RzKSAlPiUKICAgICAgICAgIGRwbHlyOjpncm91cF9ieShzYW1wbGVfcm93X24sIGNvcnJ1cHRfc2l6ZV9uYW1lLCBtZXRob2QpICU+JQogICAgICAgICAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gbWVhbiguZGF0YVtbbWV0cmljXV0pKQogICAgICAgIG1pbl95IDwtIG1pbih0bXAkbWVhbikKICAgICAgICBtYXhfeSA8LSBtYXgodG1wJG1lYW4pCiAgICAgICAgZm9yIChoIGluIGNvcnJ1cHRfc2l6ZXMpIHsKICAgICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvcnJ1cHRfc2l6ZV9uYW1lID09ICEhaCkgJT4lCiAgICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgICApCiAgICAgICAgICBpZiAoaCAhPSBjb3JydXB0X3NpemVzWzFdKSB7CiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWVhbl9zaGlmdCAlaW4lIHJlbW92ZV94X2F4aXNfbW9kZWxzKSB7CiAgICAgICAgICAgIGhlaWdodCA8LSAyLjcyCiAgICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWlnaHQgPC0gMwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoKGggPT0gY29ycnVwdF9zaXplc1tsZW5ndGgoY29ycnVwdF9zaXplcyldKSAmIAogICAgICAgICAgICAgICAgKG1lYW5fc2hpZnQgJWluJSBrZWVwX2xlZ2VuZF9tZWFuX3NoaWZ0cykgJgogICAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICAgIH0KICAgICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgICAgfQogICAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsIHNwcmludGYoInJvYnVzdF9zaW1zXyVzXyVzXyVzTVNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZWFuX3NoaWZ0LCBtZXRyaWMpKSwKICAgICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gaGVpZ2h0CiAgICAgICAgKQogICAgICB9IGVsc2UgewogICAgICAgIHBsdCA8LSByZXN1bHRzICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9ICJjb3JydXB0X3NpemVfbmFtZSIsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwKICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICAgICkKICAgICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgICAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKICAgICAgfQogICAgfQogIH0KfQoKYGBgCgoKIyBDb3JyZWxhdGlvbiBCaWFzIFNpbXVsYXRpb25zIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCiMjIE1haW4gRmlndXJlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoImJsYWNrIiwgIiMyMThhMWUiLCAib3JhbmdlIiwgIiM3MWJlYjciLCAiI2NjMzM5OSIpCnNob3dfbWV0aG9kcyA8LSBjKCJHTURJIiwgIk1ESS1vb2IiLCAiTURBIiwgIk1ESSIsICAiVHJlZVNIQVAiKQptZXRob2RfbGFiZWxzIDwtIGMoIkdNREkgKHJpZGdlKSIsICJNREktb29iIiwgIk1EQSIsICJNREkiLCAiVHJlZVNIQVAiKQoKY3VzdG9tX2NvbG9yX3BhbGV0dGUgPC0gYygiIzM4NzYxZCIsICIjOWRjODliIiwgIiM5OTE1MDAiKQprZWVwX2hlcml0YWJpbGl0aWVzIDwtIGMoMC4xLCAwLjQpCnNpbV9uYW1lIDwtICJnbWRpLm1kaV9iaWFzX3NpbXMuY29ycmVsYXRpb25fc2ltcy5ub3JtYWxfYmxvY2tfY29yX3BhcnRpYWxfbGluZWFyX2xzc19kZ3AiCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgc2ltX25hbWUsCiAgInZhcnlpbmdfaGVyaXRhYmlsaXR5X3JobyIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgJWluJSBrZWVwX2hlcml0YWJpbGl0aWVzKQoKbiA8LSAyNTAKcCA8LSAxMDAKc2lnX2lkcyA8LSAwOjUKY25zaWdfaWRzIDwtIDY6NDkKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgojIyMjIEV4YW1pbmUgYXZlcmFnZSByYW5rIGFjcm9zcyB2YXJ5aW5nIGNvcnJlbGF0aW9uIGxldmVscyAjIyMjCnBsdF9iYXNlIDwtIHBsb3RfcGVydHVyYmF0aW9uX3N0YWJpbGl0eSgKICByZXN1bHRzLAogIGZhY2V0X3Jvd3MgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogIGZhY2V0X2NvbHMgPSAicmhvX25hbWUiLAogIHBhcmFtX25hbWUgPSBOVUxMLAogIHNpZ19pZHMgPSBzaWdfaWRzLAogIGNuc2lnX2lkcyA9IGNuc2lnX2lkcywKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKZm9yIChpZHggaW4gMTpsZW5ndGgoa2VlcF9oZXJpdGFiaWxpdGllcykpIHsKICBoIDwtIGtlZXBfaGVyaXRhYmlsaXRpZXNbaWR4XQogIGNhdChzcHJpbnRmKCJcblxuIyMjIFBWRSA9ICVzXG5cbiIsIGgpKQogIHBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbW2lkeF1dJGRhdGEKICBwbHRfbHMgPC0gbGlzdCgpCiAgZm9yIChtZXRob2QgaW4gbWV0aG9kX2xhYmVscykgewogICAgcGx0X2xzW1ttZXRob2RdXSA8LSBwbHRfZGYgJT4lCiAgICAgIGRwbHlyOjpmaWx0ZXIoZmkgPT0gbWV0aG9kKSAlPiUKICAgICAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogICAgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZ3JvdXApICsKICAgICAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkgKwogICAgICBnZ3Bsb3QyOjpnZW9tX3JpYmJvbigKICAgICAgICBnZ3Bsb3QyOjphZXMoeCA9IHJob19uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IC5tZWFuIC0gKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAgICAgICAgICAgICAgICAgIHltYXggPSAubWVhbiArICguc2QgLyBzcXJ0KG5yZXBzKSksIAogICAgICAgICAgICAgICAgICAgICBmaWxsID0gZ3JvdXApLCAKICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYSA9IDAuMgogICAgICApICsKICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICB4ID0gZXhwcmVzc2lvbigiQ29ycmVsYXRpb24gKCIqcmhvKiIpIiksIAogICAgICAgIHkgPSAiQXZlcmFnZSBSYW5rIiwgCiAgICAgICAgY29sb3IgPSAiRmVhdHVyZVxuR3JvdXAiLCAKICAgICAgICB0aXRsZSA9IG1ldGhvZAogICAgICApICsKICAgICAgZ2dwbG90Mjo6Y29vcmRfY2FydGVzaWFuKAogICAgICAgIHlsaW0gPSBjKG1pbihwbHRfZGYkLm1lYW4pIC0gMywgbWF4KHBsdF9kZiQubWVhbikgKyAzKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKAogICAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICAgKSArCiAgICAgIGdncGxvdDI6OnNjYWxlX2ZpbGxfbWFudWFsKAogICAgICAgIHZhbHVlcyA9IGN1c3RvbV9jb2xvcl9wYWxldHRlLCBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkKICAgICAgKSArCiAgICAgIGdncGxvdDI6Omd1aWRlcyhmaWxsID0gIm5vbmUiLCBsaW5ldHlwZSA9ICJub25lIikgKwogICAgICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICAgICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICAgICApCiAgICBpZiAobWV0aG9kICE9IG1ldGhvZF9sYWJlbHNbMV0pIHsKICAgICAgcGx0X2xzW1ttZXRob2RdXSA8LSBwbHRfbHNbW21ldGhvZF1dICsKICAgICAgICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgfQogIH0KICAKICBwbHRfd2lkZSA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBndWlkZXMgPSAiY29sbGVjdCIsIG5yb3cgPSAxKQogIGlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgICBnZ3Bsb3QyOjpnZ3NhdmUocGx0X3dpZGUsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCBzcHJpbnRmKCJjb3JyZWxhdGlvbl9zaW1fcHZlJXNfd2lkZS5wZGYiLCBoKSksCiAgICAgICAgICAgICAgICAgICAgIyBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjU1LCB3aWR0aCA9IGZpZ193aWR0aCAqIC4yNSAqIGxlbmd0aChzaG93X21ldGhvZHMpKQogICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNTUsIHdpZHRoID0gZmlnX3dpZHRoICogLjMgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICB9IGVsc2UgewogICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgIHBsdF93aWRlLCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC44LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICAgICkKICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgfQp9CgoKIyMjIyBFeGFtaW5lIG51bWJlciBvZiBzcGxpdHMgYWNyb3NzIHZhcnlpbmcgY29ycmVsYXRpb24gbGV2ZWxzICMjIyMKY2F0KCJcblxuIyMjIE51bWJlciBvZiBSRiBTcGxpdHMgXG5cbiIpCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgJWluJSBrZWVwX2hlcml0YWJpbGl0aWVzLAogICAgICAgICAgICAgICAgZmkgPT0gIk1ESV93aXRoX3NwbGl0cyIpCgp0b3RhbF9zcGxpdHMgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkocmhvX25hbWUsIGhlcml0YWJpbGl0eSwgcmVwKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG5fc3BsaXRzID0gc3VtKGF2X3NwbGl0cykpCgpwbHRfZGYgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6bGVmdF9qb2luKAogICAgdG90YWxfc3BsaXRzLCBieSA9IGMoInJob19uYW1lIiwgImhlcml0YWJpbGl0eSIsICJyZXAiKQogICkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGF2X3NwbGl0cyA9IGF2X3NwbGl0cyAvIG5fc3BsaXRzICogMTAwLAogICAgZ3JvdXAgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB2YXIgJWluJSBzaWdfaWRzIH4gIlNpZyIsCiAgICAgIHZhciAlaW4lIGNuc2lnX2lkcyB+ICJDLU5TaWciLAogICAgICBUUlVFIH4gIk5TaWciCiAgICApCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgZ3JvdXAgPSBmYWN0b3IoZ3JvdXAsIGxldmVscyA9IGMoIlNpZyIsICJDLU5TaWciLCAiTlNpZyIpKQogICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHJob19uYW1lLCBoZXJpdGFiaWxpdHksIGdyb3VwKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKbWluX3kgPC0gbWluKHBsdF9kZiQubWVhbikKbWF4X3kgPC0gbWF4KHBsdF9kZiQubWVhbikKCnBsdF9scyA8LSBsaXN0KCkKZm9yIChpZHggaW4gMTpsZW5ndGgoa2VlcF9oZXJpdGFiaWxpdGllcykpIHsKICBoIDwtIGtlZXBfaGVyaXRhYmlsaXRpZXNbaWR4XQogIHBsdCA8LSBwbHRfZGYgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogICAgZ2dwbG90Mjo6YWVzKHggPSByaG9fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGdyb3VwKSArCiAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICAgICMgZ2dwbG90Mjo6Z2VvbV9yaWJib24oCiAgICAjICAgZ2dwbG90Mjo6YWVzKHggPSByaG9fbmFtZSwgCiAgICAjICAgICAgICAgICAgICAgIHltaW4gPSAubWVhbiAtICguc2QgLyBzcXJ0KG5yZXBzKSksIAogICAgIyAgICAgICAgICAgICAgICB5bWF4ID0gLm1lYW4gKyAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICMgICAgICAgICAgICAgICAgZmlsbCA9IGdyb3VwKSwgCiAgICAjICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGEgPSAwLjIKICAgICMgKSArCiAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICB4ID0gZXhwcmVzc2lvbigiQ29ycmVsYXRpb24gKCIqcmhvKiIpIiksIAogICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgU3BsaXRzIGluIFJGICglKSIsCiAgICAgIGNvbG9yID0gIkZlYXR1cmVcbkdyb3VwIiwgCiAgICAgIHRpdGxlID0gc3ByaW50ZigiUFZFID0gJXMiLCBoKQogICAgKSArCiAgICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMobWluX3ksIG1heF95KSkgKwogICAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKAogICAgICB2YWx1ZXMgPSBjdXN0b21fY29sb3JfcGFsZXR0ZSwgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpCiAgICApICsKICAgIGdncGxvdDI6OnNjYWxlX2ZpbGxfbWFudWFsKAogICAgICB2YWx1ZXMgPSBjdXN0b21fY29sb3JfcGFsZXR0ZSwgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpCiAgICApICsKICAgIGdncGxvdDI6Omd1aWRlcyhmaWxsID0gIm5vbmUiLCBsaW5ldHlwZSA9ICJub25lIikgKwogICAgdnRoZW1lczo6dGhlbWVfdm1vZGVybigKICAgICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgICAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgYXhpcy50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgIGxlZ2VuZC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgpLAogICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgICApCiAgaWYgKGlkeCAhPSAxKSB7CiAgICBwbHQgPC0gcGx0ICsKICAgICAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogIH0KICBwbHRfbHNbW2lkeF1dIDwtIHBsdAp9CgpwbHRfd2lkZSA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBndWlkZXMgPSAiY29sbGVjdCIsIG5yb3cgPSAxKQppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIGdncGxvdDI6Omdnc2F2ZShwbHRfd2lkZSAmIGdncGxvdDI6OnRoZW1lKHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpLCAKICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjb3JyZWxhdGlvbl9zaW1fbnVtX3NwbGl0cy5wZGYiKSwKICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjY1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGx0X3dpZGUsIGkgPSBjaHVua19pZHgsIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICApCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQoKYGBgCgojIyBBcHBlbmRpeCBGaWd1cmVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9CgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gYygiYmxhY2siLCAiZ3JheSIpCnNob3dfbWV0aG9kcyA8LSBjKCJHTURJIiwgIkdNRElfaW5iYWciKQptZXRob2RfbGFiZWxzIDwtIGMoIkdNREkgKExPTykiLCAiR01ESSAoaW4tYmFnKSIpCgpjdXN0b21fY29sb3JfcGFsZXR0ZSA8LSBjKCIjMzg3NjFkIiwgIiM5ZGM4OWIiLCAiIzk5MTUwMCIpCmtlZXBfaGVyaXRhYmlsaXRpZXMgPC0gYygwLjEsIDAuNCkKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5jb3JyZWxhdGlvbl9zaW1zLm5vcm1hbF9ibG9ja19jb3JfcGFydGlhbF9saW5lYXJfbHNzX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfcmhvIiwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihoZXJpdGFiaWxpdHlfbmFtZSAlaW4lIGtlZXBfaGVyaXRhYmlsaXRpZXMpCgpuIDwtIDI1MApwIDwtIDEwMApzaWdfaWRzIDwtIDA6NQpjbnNpZ19pZHMgPC0gNjo0OQpucmVwcyA8LSBsZW5ndGgodW5pcXVlKHJlc3VsdHMkcmVwKSkKCiMjIyMgRXhhbWluZSBhdmVyYWdlIHJhbmsgYWNyb3NzIHZhcnlpbmcgY29ycmVsYXRpb24gbGV2ZWxzICMjIyMKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJyaG9fbmFtZSIsCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgc2lnX2lkcyA9IHNpZ19pZHMsCiAgY25zaWdfaWRzID0gY25zaWdfaWRzLAogIHBsb3RfdHlwZXMgPSAiZXJyYmFyIiwKICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwopCgpmb3IgKGlkeCBpbiAxOmxlbmd0aChrZWVwX2hlcml0YWJpbGl0aWVzKSkgewogIGggPC0ga2VlcF9oZXJpdGFiaWxpdGllc1tpZHhdCiAgY2F0KHNwcmludGYoIlxuXG4jIyMgUFZFID0gJXNcblxuIiwgaCkpCiAgcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbaWR4XV0kZGF0YQogIHBsdF9scyA8LSBsaXN0KCkKICBmb3IgKG1ldGhvZCBpbiBtZXRob2RfbGFiZWxzKSB7CiAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9kZiAlPiUKICAgICAgZHBseXI6OmZpbHRlcihmaSA9PSBtZXRob2QpICU+JQogICAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBncm91cCkgKwogICAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSArCiAgICAgIGdncGxvdDI6Omdlb21fcmliYm9uKAogICAgICAgIGdncGxvdDI6OmFlcyh4ID0gcmhvX25hbWUsIAogICAgICAgICAgICAgICAgICAgICB5bWluID0gLm1lYW4gLSAoLnNkIC8gc3FydChucmVwcykpLCAKICAgICAgICAgICAgICAgICAgICAgeW1heCA9IC5tZWFuICsgKC5zZCAvIHNxcnQobnJlcHMpKSwgCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBncm91cCksIAogICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhID0gMC4yCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgIHggPSBleHByZXNzaW9uKCJDb3JyZWxhdGlvbiAoIipyaG8qIikiKSwgCiAgICAgICAgeSA9ICJBdmVyYWdlIFJhbmsiLCAKICAgICAgICBjb2xvciA9ICJGZWF0dXJlXG5Hcm91cCIsIAogICAgICAgIHRpdGxlID0gbWV0aG9kCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICAgICAgeWxpbSA9IGMobWluKHBsdF9kZiQubWVhbikgLSAzLCBtYXgocGx0X2RmJC5tZWFuKSArIDMpCiAgICAgICkgKwogICAgICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6c2NhbGVfZmlsbF9tYW51YWwoCiAgICAgICAgdmFsdWVzID0gY3VzdG9tX2NvbG9yX3BhbGV0dGUsIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKQogICAgICApICsKICAgICAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGxpbmV0eXBlID0gIm5vbmUiKSArCiAgICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgICAgICBheGlzLnRpY2tzID0gZ2dwbG90Mjo6ZWxlbWVudF9saW5lKHNpemUgPSBnZ3Bsb3QyOjpyZWwoMiksIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgICAgICkKICAgIGlmIChtZXRob2QgIT0gbWV0aG9kX2xhYmVsc1sxXSkgewogICAgICBwbHRfbHNbW21ldGhvZF1dIDwtIHBsdF9sc1tbbWV0aG9kXV0gKwogICAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICB9CiAgfQogIAogIHBsdF93aWRlIDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhwbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbnJvdyA9IDEpCiAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgIGdncGxvdDI6Omdnc2F2ZShwbHRfd2lkZSwgCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIHNwcmludGYoImNvcnJlbGF0aW9uX3NpbV9wdmUlc193aWRlX2FwcGVuZGl4LnBkZiIsIGgpKSwKICAgICAgICAgICAgICAgICAgICAjIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNTUsIHdpZHRoID0gZmlnX3dpZHRoICogLjI1ICogbGVuZ3RoKHNob3dfbWV0aG9kcykpCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMzcgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICB9IGVsc2UgewogICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgIHBsdF93aWRlLCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgICApCiAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogIH0KfQpgYGAKCgojIEVudHJvcHkgQmlhcyBTaW11bGF0aW9ucyB7LnRhYnNldCAudGFic2V0LXZtb2Rlcm59CgojIyBNYWluIEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBSZXN1bHRzICMjIyMKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gcmV2KGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpKQpzaG93X21ldGhvZHMgPC0gcmV2KGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikpCm1ldGhvZF9sYWJlbHMgPC0gcmV2KGMoIkdNREkgKHJpZGdlKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIHJlcCgwLjcsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKSkKeV9saW1pdHMgPC0gYygxLCA0LjUpCgptZXRyaWNfbmFtZSA8LSAiQVVST0MiCnNpbV9uYW1lIDwtICJnbWRpLm1kaV9iaWFzX3NpbXMuZW50cm9weV9zaW1zLmxpbmVhcl9kZ3AiCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgc2ltX25hbWUsCiAgInZhcnlpbmdfaGVyaXRhYmlsaXR5X24iLAogIHNwcmludGYoInNlZWQlcyIsIHNlZWQpLAogICJyZXN1bHRzLmNzdiIKKQoKIyMjIyBFbnRyb3B5IFJlZ3Jlc3Npb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eV9uYW1lID09IDAuMSkKCmN1c3RvbV9ncm91cF9mdW4gPC0gZnVuY3Rpb24odmFyKSB2YXIKCnBsdF9iYXNlIDwtIHBsb3RfcGVydHVyYmF0aW9uX3N0YWJpbGl0eSgKICByZXN1bHRzLAogIGZhY2V0X3Jvd3MgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X3JlZ3Jlc3Npb24gPC0gcGx0X2RmICU+JQogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMCkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbl9uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZmksIGFscGhhID0gZmkpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSkgKwogIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIlNhbXBsZSBTaXplIiwgCiAgICB5ID0gZXhwcmVzc2lvbigiQXZlcmFnZSBSYW5rIG9mICIqWFsxXSksIAogICAgY29sb3IgPSAiTWV0aG9kIiwKICAgIHRpdGxlID0gIlJlZ3Jlc3Npb24iCiAgKSArCiAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYWxwaGFfdmFsdWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6Y29vcmRfY2FydGVzaWFuKHlsaW0gPSB5X2xpbWl0cykgKwogIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICBzaXplX3ByZXNldCA9ICJtZWRpdW0iLCBiZ19jb2xvciA9ICJ3aGl0ZSIsIGdyaWRfY29sb3IgPSAid2hpdGUiLAogICAgYXhpcy50aWNrcyA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShzaXplID0gZ2dwbG90Mjo6cmVsKDIpLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgYXhpcy50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAicGxhaW4iKSwKICAgIGxlZ2VuZC50ZXh0ID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgIHBsb3QudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkKICApCgojIyMjIEVudHJvcHkgUmVncmVzc2lvbiAjIFNwbGl0cyAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgPT0gMC4xLCAKICAgICAgICAgICAgICAgIGZpID09ICJNRElfd2l0aF9zcGxpdHMiKQoKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgp0b3RhbF9zcGxpdHMgPC0gcmVzdWx0cyAlPiUKICBkcGx5cjo6Z3JvdXBfYnkobl9uYW1lLCBoZXJpdGFiaWxpdHksIHJlcCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShuX3NwbGl0cyA9IHN1bShhdl9zcGxpdHMpKQoKcmVncmVzc2lvbl9udW1fc3BsaXRzX2RmIDwtIHJlc3VsdHMgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHRvdGFsX3NwbGl0cywgYnkgPSBjKCJuX25hbWUiLCAiaGVyaXRhYmlsaXR5IiwgInJlcCIpCiAgKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgYXZfc3BsaXRzID0gYXZfc3BsaXRzIC8gbl9zcGxpdHMgKiAxMDAKICApICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGhlcml0YWJpbGl0eSwgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uIFJlc3VsdHMgIyMjIwptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSByZXYoYygiYmxhY2siLCAiIzlCNURGRiIsICJvcmFuZ2UiLCAiIzcxYmViNyIsICIjMjE4YTFlIiwgIiNjYzMzOTkiKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJX3JpZGdlIiwgIkdNRElfbG9naXN0aWNfbG9nbG9zcyIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKbWV0aG9kX2xhYmVscyA8LSByZXYoYygiR01ESSAocmlkZ2UpIiwgIkdNREkgKGxvZ2lzdGljKSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIDEsIHJlcCgwLjcsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubG9naXN0aWNfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2NfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJjX25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgZGVzY2VuZGluZ19tZXRob2RzID0gIkdNREkgKGxvZ2lzdGljKSIsCiAgcGFyYW1fbmFtZSA9IE5VTEwsCiAgcGxvdF90eXBlcyA9ICJlcnJiYXIiLAogIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzCikKCnBsdF9kZiA8LSBwbHRfYmFzZSRhZ2dbWzFdXSRkYXRhCm5yZXBzIDwtIGxlbmd0aCh1bmlxdWUocmVzdWx0cyRyZXApKQoKcGx0X2NsYXNzaWZpY2F0aW9uIDwtIHBsdF9kZiAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyb3VwID09IDApICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGZpLCBhbHBoYSA9IGZpKSArCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKHNpemUgPSBsaW5lX3NpemUpICsKICBnZ3Bsb3QyOjpsYWJzKAogICAgeCA9ICJTYW1wbGUgU2l6ZSIsIAogICAgeSA9IGV4cHJlc3Npb24oIkF2ZXJhZ2UgUmFuayBvZiAiKlhbMV0pLCAKICAgIGNvbG9yID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJDbGFzc2lmaWNhdGlvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICB5bGltID0geV9saW1pdHMKICApICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpCiAgKQoKIyMjIyBFbnRyb3B5IENsYXNzaWZpY2F0aW9uICMgU3BsaXRzICMjIyMKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkgJT4lCiAgZHBseXI6OmZpbHRlcihmaSA9PSAiTURJX3dpdGhfc3BsaXRzIikKCnRvdGFsX3NwbGl0cyA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpncm91cF9ieShuX25hbWUsIGMsIHJlcCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShuX3NwbGl0cyA9IHN1bShhdl9zcGxpdHMpKQoKY2xhc3NpZmljYXRpb25fbnVtX3NwbGl0c19kZiA8LSByZXN1bHRzICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB0b3RhbF9zcGxpdHMsIGJ5ID0gYygibl9uYW1lIiwgImMiLCAicmVwIikKICApICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBhdl9zcGxpdHMgPSBhdl9zcGxpdHMgLyBuX3NwbGl0cyAqIDEwMAogICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KG5fbmFtZSwgYywgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgLm1lYW4gPSBtZWFuKGF2X3NwbGl0cyksCiAgICAuc2QgPSBzZChhdl9zcGxpdHMpCiAgKQoKIyMjIyBTaG93IEF2ZyBSYW5rIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgQXZlcmFnZSBSYW5rIFxuXG4iKQpwbHQgPC0gcGx0X3JlZ3Jlc3Npb24gKyBwbHRfY2xhc3NpZmljYXRpb24KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0LCBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImVudHJvcHlfc2ltcy5wZGYiKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gZmlnX3dpZHRoICogMS4yLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjY1KQp9IGVsc2UgewogIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgcGx0LCBpID0gY2h1bmtfaWR4LCBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC44LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICApCiAgY2h1bmtfaWR4IDwtIGNodW5rX2lkeCArIDEKfQoKIyMjIyBTaG93ICMgU3BsaXRzIFBsb3QgIyMjIwpjYXQoIlxuXG4jIyMgTnVtYmVyIG9mIFJGIFNwbGl0cyBcblxuIikKcGx0X2RmIDwtIGRwbHlyOjpiaW5kX3Jvd3MoCiAgUmVncmVzc2lvbiA9IHJlZ3Jlc3Npb25fbnVtX3NwbGl0c19kZiwgCiAgQ2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbl9udW1fc3BsaXRzX2RmLCAKICAuaWQgPSAidHlwZSIKKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgdmFyID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgdmFyID09IDAgfiAiQmVybm91bGxpIChTaWduYWwpIiwKICAgICAgdmFyID09IDEgfiAiTm9ybWFsIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSAyIH4gIjQtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICB2YXIgPT0gMyB+ICIxMC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgIHZhciA9PSA0IH4gIjIwLUNhdGVnb3JpZXMgKE5vbi1TaWduYWwpIgogICAgKSAlPiUKICAgICAgZmFjdG9yKGxldmVscyA9IGMoIk5vcm1hbCAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMjAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiMTAtQ2F0ZWdvcmllcyAoTm9uLVNpZ25hbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAiNC1DYXRlZ29yaWVzIChOb24tU2lnbmFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJCZXJub3VsbGkgKFNpZ25hbCkiKSkKICApCgpzaW1fdHlwZXMgPC0gdW5pcXVlKHBsdF9kZiR0eXBlKQpwbHRfbHMgPC0gbGlzdCgpCmZvciAoaWR4IGluIDE6bGVuZ3RoKHNpbV90eXBlcykpIHsKICBzaW1fdHlwZSA8LSBzaW1fdHlwZXNbaWR4XQogIHBsdCA8LSBwbHRfZGYgJT4lCiAgICBkcGx5cjo6ZmlsdGVyKHR5cGUgPT0gISFzaW1fdHlwZSkgJT4lCiAgICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgICBnZ3Bsb3QyOjphZXMoeCA9IG5fbmFtZSwgeSA9IC5tZWFuLCBjb2xvciA9IGFzLmZhY3Rvcih2YXIpKSArCiAgICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICAgIHggPSAiU2FtcGxlIFNpemUiLAogICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgU3BsaXRzIGluIFJGICglKSIsCiAgICAgIGNvbG9yID0gIkZlYXR1cmUiLCAKICAgICAgdGl0bGUgPSBzaW1fdHlwZQogICAgKSArCiAgICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgbGluZXR5cGUgPSAibm9uZSIpICsKICAgIHZ0aGVtZXM6OnRoZW1lX3Ztb2Rlcm4oCiAgICAgIHNpemVfcHJlc2V0ID0gIm1lZGl1bSIsIGJnX2NvbG9yID0gIndoaXRlIiwgZ3JpZF9jb2xvciA9ICJ3aGl0ZSIsCiAgICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgIGF4aXMudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBheGlzLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgZmFjZSA9ICJwbGFpbiIpLAogICAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICBsZWdlbmQudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgcGxvdC50aXRsZSA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICAgKQogIGlmIChpZHggIT0gMSkgewogICAgcGx0IDwtIHBsdCArCiAgICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICB9CiAgcGx0X2xzW1tpZHhdXSA8LSBwbHQKfQoKcGx0X3dpZGUgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgZ3VpZGVzID0gImNvbGxlY3QiLCBucm93ID0gMSkKaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBnZ3Bsb3QyOjpnZ3NhdmUocGx0X3dpZGUsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiZW50cm9weV9zaW1zX251bV9zcGxpdHMucGRmIiksCiAgICAgICAgICAgICAgICAgICMgaGVpZ2h0ID0gZmlnX2hlaWdodCAqIC41NSwgd2lkdGggPSBmaWdfd2lkdGggKiAuMjUgKiBsZW5ndGgoc2hvd19tZXRob2RzKSkKICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLjEsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHRfd2lkZSwgaSA9IGNodW5rX2lkeCwgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCiMjIEFwcGVuZGl4IEZpZ3VyZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBSZXN1bHRzICMjIyMKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gcmV2KGMoImJsYWNrIiwgImJsYWNrIiwgIiM3MWJlYjciKSkKc2hvd19tZXRob2RzIDwtIHJldihjKCJHTURJIiwgIkdNRElfaW5iYWciLCAiTURJIikpCm1ldGhvZF9sYWJlbHMgPC0gcmV2KGMoIkdNREkgKHJpZGdlLCBMT08pIiwgIkdNREkgKHJpZGdlLCBpbi1iYWcpIiwgIk1ESSIpKQphbHBoYV92YWx1ZXMgPC0gcmV2KGMoMSwgMSwgcmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDIpKSkKbGluZXR5cGVfdmFsdWVzIDwtIGMoInNvbGlkIiwgImRhc2hlZCIsICJzb2xpZCIpCnlfbGltaXRzIDwtIGMoMSwgNSkKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubGluZWFyX2RncCIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBzaW1fbmFtZSwKICAidmFyeWluZ19oZXJpdGFiaWxpdHlfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgUmVncmVzc2lvbiBBdmcgUmFuayAjIyMjCnJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpICU+JQogIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5X25hbWUgPT0gMC4xKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJoZXJpdGFiaWxpdHlfbmFtZSIsCiAgZmFjZXRfY29scyA9ICJuX25hbWUiLCAKICBncm91cF9mdW4gPSBjdXN0b21fZ3JvdXBfZnVuLCAKICBwYXJhbV9uYW1lID0gTlVMTCwKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbMV1dJGRhdGEKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgpwbHRfcmVncmVzc2lvbiA8LSBwbHRfZGYgJT4lCiAgZHBseXI6OmZpbHRlcihncm91cCA9PSAwKSAlPiUKICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArCiAgZ2dwbG90Mjo6YWVzKHggPSBuX25hbWUsIHkgPSAubWVhbiwgY29sb3IgPSBmaSwgYWxwaGEgPSBmaSwgbGluZXR5cGUgPSBmaSkgKwogIGdncGxvdDI6Omdlb21fbGluZShzaXplID0gbGluZV9zaXplKSArCiAgZ2dwbG90Mjo6bGFicygKICAgIHggPSAiU2FtcGxlIFNpemUiLCAKICAgIHkgPSBleHByZXNzaW9uKCJBdmVyYWdlIFJhbmsgb2YgIipYWzFdKSwgCiAgICBjb2xvciA9ICJNZXRob2QiLAogICAgbGluZXR5cGUgPSAiTWV0aG9kIiwKICAgIHRpdGxlID0gIlJlZ3Jlc3Npb24iCiAgKSArCiAgZ2dwbG90Mjo6Z3VpZGVzKGZpbGwgPSAibm9uZSIsIGFscGhhID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6c2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYWxwaGFfdmFsdWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBnZ3Bsb3QyOjpndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgZ2dwbG90Mjo6c2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGxpbmV0eXBlX3ZhbHVlcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OmNvb3JkX2NhcnRlc2lhbih5bGltID0geV9saW1pdHMpICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLAogICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMSwgImNtIikKICApCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gUmVzdWx0cyAjIyMjCm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIHJldihjKCJibGFjayIsICJibGFjayIsICIjOUI1REZGIiwgIiM5QjVERkYiLCAiIzcxYmViNyIpKQpzaG93X21ldGhvZHMgPC0gcmV2KGMoIkdNRElfcmlkZ2UiLCAiR01ESV9yaWRnZV9pbmJhZyIsICJHTURJX2xvZ2lzdGljX2xvZ2xvc3MiLCAiR01ESV9sb2dpc3RpY19sb2dsb3NzX2luYmFnIiwgIk1ESSIpKQptZXRob2RfbGFiZWxzIDwtIHJldihjKCJHTURJIChyaWRnZSwgTE9PKSIsICJHTURJIChyaWRnZSwgaW4tYmFnKSIsICJHTURJIChsb2dpc3RpYywgTE9PKSIsICJHTURJIChsb2dpc3RpYywgaW4tYmFnKSIsICJNREkiKSkKYWxwaGFfdmFsdWVzIDwtIHJldihjKDEsIDEsIDEsIDEsIHJlcCgxLCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSA0KSkpCmxpbmV0eXBlX3ZhbHVlcyA8LSBjKCJzb2xpZCIsICJkYXNoZWQiLCAic29saWQiLCAiZGFzaGVkIiwgInNvbGlkIikKCm1ldHJpY19uYW1lIDwtICJBVVJPQyIKc2ltX25hbWUgPC0gImdtZGkubWRpX2JpYXNfc2ltcy5lbnRyb3B5X3NpbXMubG9naXN0aWNfZGdwIgpmbmFtZSA8LSBmaWxlLnBhdGgoCiAgcmVzdWx0c19kaXIsIAogIHNpbV9uYW1lLAogICJ2YXJ5aW5nX2NfbiIsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopCgojIyMjIEVudHJvcHkgQ2xhc3NpZmljYXRpb24gQXZnIFJhbmsgIyMjIwpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQoKY3VzdG9tX2dyb3VwX2Z1biA8LSBmdW5jdGlvbih2YXIpIHZhcgoKcGx0X2Jhc2UgPC0gcGxvdF9wZXJ0dXJiYXRpb25fc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZmFjZXRfcm93cyA9ICJjX25hbWUiLAogIGZhY2V0X2NvbHMgPSAibl9uYW1lIiwgCiAgZ3JvdXBfZnVuID0gY3VzdG9tX2dyb3VwX2Z1biwgCiAgZGVzY2VuZGluZ19tZXRob2RzID0gYygiR01ESSAobG9naXN0aWMsIExPTykiLCAiR01ESSAobG9naXN0aWMsIGluLWJhZykiKSwKICBwYXJhbV9uYW1lID0gTlVMTCwKICBwbG90X3R5cGVzID0gImVycmJhciIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcGx0X2RmIDwtIHBsdF9iYXNlJGFnZ1tbMV1dJGRhdGEKbnJlcHMgPC0gbGVuZ3RoKHVuaXF1ZShyZXN1bHRzJHJlcCkpCgpwbHRfY2xhc3NpZmljYXRpb24gPC0gcGx0X2RmICU+JQogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gMCkgJT4lCiAgZ2dwbG90Mjo6Z2dwbG90KCkgKwogIGdncGxvdDI6OmFlcyh4ID0gbl9uYW1lLCB5ID0gLm1lYW4sIGNvbG9yID0gZmksIGFscGhhID0gZmksIGxpbmV0eXBlID0gZmkpICsKICBnZ3Bsb3QyOjpnZW9tX2xpbmUoc2l6ZSA9IGxpbmVfc2l6ZSkgKwogIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIlNhbXBsZSBTaXplIiwgCiAgICB5ID0gZXhwcmVzc2lvbigiQXZlcmFnZSBSYW5rIG9mICIqWFsxXSksIAogICAgY29sb3IgPSAiTWV0aG9kIiwKICAgIGxpbmV0eXBlID0gIk1ldGhvZCIsCiAgICB0aXRsZSA9ICJDbGFzc2lmaWNhdGlvbiIKICApICsKICBnZ3Bsb3QyOjpndWlkZXMoZmlsbCA9ICJub25lIiwgYWxwaGEgPSAibm9uZSIpICsKICBnZ3Bsb3QyOjpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ2dwbG90Mjo6Z3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIGdncGxvdDI6OnNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBhbHBoYV92YWx1ZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gbGluZXR5cGVfdmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGdncGxvdDI6Omd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBnZ3Bsb3QyOjpjb29yZF9jYXJ0ZXNpYW4oCiAgICB5bGltID0geV9saW1pdHMKICApICsKICB2dGhlbWVzOjp0aGVtZV92bW9kZXJuKAogICAgc2l6ZV9wcmVzZXQgPSAibWVkaXVtIiwgYmdfY29sb3IgPSAid2hpdGUiLCBncmlkX2NvbG9yID0gIndoaXRlIiwKICAgIGF4aXMudGlja3MgPSBnZ3Bsb3QyOjplbGVtZW50X2xpbmUoc2l6ZSA9IGdncGxvdDI6OnJlbCgyKSwgY29sb3VyID0gImJsYWNrIiksCiAgICBheGlzLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgIGF4aXMudGl0bGUgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gInBsYWluIiksCiAgICBsZWdlbmQudGV4dCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgbGVnZW5kLnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLAogICAgbGVnZW5kLmtleS53aWR0aCA9IGdncGxvdDI6OnVuaXQoMSwgImNtIikKICApCgojIyMjIFNob3cgQXZnIFJhbmsgUGxvdCAjIyMjCmNhdCgiXG5cbiMjIyBBdmVyYWdlIFJhbmsgXG5cbiIpCnBsdCA8LSBwbHRfcmVncmVzc2lvbiArIHBsdF9jbGFzc2lmaWNhdGlvbgppZiAocGFyYW1zJGZvcl9wYXBlcikgewogIGdncGxvdDI6Omdnc2F2ZShwbHQsIGZpbGVuYW1lID0gZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAiYXBwZW5kaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyb3B5X3NpbXNfYXBwZW5kaXgucGRmIiksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IGZpZ193aWR0aCAqIDEuMzUsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAuNjUpCn0gZWxzZSB7CiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICBwbHQsIGkgPSBjaHVua19pZHgsIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0ICogLjcsIGZpZ193aWR0aCA9IGZpZ193aWR0aCAqIDEuMwogICkKICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQp9CgpgYGAKCgojIENDTEUgQ2FzZSBTdHVkeSB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpCnNob3dfbWV0aG9kcyA8LSBjKCJHTURJIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpCm1ldGhvZF9sYWJlbHMgPC0gYygiR01ESSAocmlkZ2UpIiwgIk1EQSIsICJNREkiLCAiTURJLW9vYiIsICJUcmVlU0hBUCIpCgpmcGF0aCA8LSAiZ21kaS5yZWFsX2RhdGFfY2FzZV9zdHVkeS5jY2xlX3JuYXNlcV9yZWdyZXNzaW9uLSIKZm5hbWUgPC0gZmlsZS5wYXRoKAogIHJlc3VsdHNfZGlyLCAKICBmcGF0aCwKICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAicmVzdWx0cy5jc3YiCikKWCA8LSBkYXRhLnRhYmxlOjpmcmVhZCgiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9kYXRhL1hfY2NsZV9ybmFzZXFfbG9nX3RyYW5zZm9ybWVkX2ZpbHRlcmVkNTAwMC5jc3YiKQpYX2NvbHVtbnMgPC0gY29sbmFtZXMoWCkKcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmbmFtZSkKCm91dCA8LSBwbG90X3RvcF9zdGFiaWxpdHkoCiAgcmVzdWx0cywKICBncm91cF9pZCA9ICJ5X3Rhc2siLAogIHRvcF9yID0gMTAsCiAgc2hvd19tYXhfZmVhdHVyZXMgPSA1LAogIHZhcm5hbWVzID0gY29sbmFtZXMoWCksCiAgYmFzZV9tZXRob2QgPSAiR01ESSAocmlkZ2UpIiwKICByZXR1cm5fZGYgPSBUUlVFLAogIGRlc2NlbmRpbmdfbWV0aG9kcyA9IE5VTEwsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSByZXYobWFudWFsX2NvbG9yX3BhbGV0dGUpLAogIHNob3dfbWV0aG9kcyA9IHJldihzaG93X21ldGhvZHMpLAogIG1ldGhvZF9sYWJlbHMgPSByZXYobWV0aG9kX2xhYmVscykKKQoKcmFua2luZ19kZiA8LSBvdXQkcmFua2luZ3MKc3RhYmlsaXR5X2RmIDwtIG91dCRzdGFiaWxpdHkKcGx0X2xzIDwtIG91dCRwbG90X2xzCgojIGdldCBnZW5lIG5hbWVzIGluc3RlYWQgb2YgRU5TRyBpZHMKbGlicmFyeShiaW9tYVJ0KQplbnNlbWJsIDwtIHVzZU1hcnQoImVuc2VtYmwiLCBkYXRhc2V0ID0gImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIpCnZhcm5hbWVzIDwtIGdldEJNKAogIGF0dHJpYnV0ZXMgPSBjKCJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiKSwgCiAgZmlsdGVycyA9ICJlbnNlbWJsX2dlbmVfaWQiLCAKICB2YWx1ZXMgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlKGNvbG5hbWVzKFgpLCAiXFwuW15cXC5dKyQiKSwgCiAgbWFydCA9IGVuc2VtYmwKKSAlPiUKICBkcGx5cjo6ZmlsdGVyKGhnbmNfc3ltYm9sICE9ICIiKSAlPiUKICBkcGx5cjo6YmluZF9yb3dzKAogICAgZGF0YS5mcmFtZShlbnNlbWJsX2dlbmVfaWQgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlKGNvbG5hbWVzKFgpLCAiXFwuW15cXC5dKyQiKSwKICAgICAgICAgICAgICAgaGduY19zeW1ib2wgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlKGNvbG5hbWVzKFgpLCAiXFwuW15cXC5dKyQiKSkKICApICU+JQogIGRwbHlyOjpkaXN0aW5jdChlbnNlbWJsX2dlbmVfaWQsIC5rZWVwX2FsbCA9IFRSVUUpCgojIGdldCB0b3AgNSBnZW5lcwp0b3BfZ2VuZXMgPC0gcmFua2luZ19kZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoeV90YXNrLCBmaSwgdmFyKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG1lYW5fcmFuayA9IG1lYW4ocmFuaykpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgZHBseXI6OmFycmFuZ2UoeV90YXNrLCBtZWFuX3JhbmspICU+JQogIGRwbHlyOjpncm91cF9ieSh5X3Rhc2ssIGZpKSAlPiUKICBkcGx5cjo6bXV0YXRlKHJhbmsgPSAxOmRwbHlyOjpuKCkpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkKCnRvcF9nZW5lc190YWJsZSA8LSB0b3BfZ2VuZXMgJT4lCiAgZHBseXI6OmZpbHRlcihyYW5rIDw9IDUpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oCiAgICB5ID0gZGF0YS5mcmFtZSh2YXIgPSAwOihuY29sKFgpIC0gMSksIAogICAgICAgICAgICAgICAgICAgZW5zZW1ibF9nZW5lX2lkID0gc3RyaW5ncjo6c3RyX3JlbW92ZShjb2xuYW1lcyhYKSwgIlxcLlteXFwuXSskIikpLAogICAgYnkgPSAidmFyIgogICkgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHkgPSB2YXJuYW1lcywgYnkgPSAiZW5zZW1ibF9nZW5lX2lkIgogICkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIHZhbHVlID0gc3ByaW50ZigiJXMgKCVzKSIsIGhnbmNfc3ltYm9sLCByb3VuZChtZWFuX3JhbmssIDIpKQogICkgJT4lCiAgdGlkeXI6OnBpdm90X3dpZGVyKAogICAgaWRfY29scyA9IGMoeV90YXNrLCByYW5rKSwgCiAgICBuYW1lc19mcm9tID0gZmksIAogICAgdmFsdWVzX2Zyb20gPSB2YWx1ZQogICkgJT4lCiAgZHBseXI6OnJlbmFtZSgKICAgICJEcnVnIiA9ICJ5X3Rhc2siLAogICAgIlJhbmsiID0gInJhbmsiCiAgKQoKIyB3cml0ZS5jc3YoCiMgICB0b3BfZ2VuZXNfdGFibGUsIGZpbGUucGF0aCh0YWJsZXNfZGlyLCAiY2NsZV9ybmFzZXFfdG9wX2dlbmVzX3RhYmxlLmNzdiIpLAojICAgcm93Lm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UKIyApCgojIGdldCAjIGdlbmVzIHdpdGggcGVyZmVjdCBzdGFiaWxpdHkKc3RhYmxlX2dlbmVzX2thYmxlIDwtIHN0YWJpbGl0eV9kZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoZmksIHlfdGFzaykgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShzdGFiaWxpdHlfMSA9IHN1bShzdGFiaWxpdHlfc2NvcmUgPT0gMSkpICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcihpZF9jb2xzID0gZmksIG5hbWVzX2Zyb20gPSB5X3Rhc2ssIHZhbHVlc19mcm9tID0gc3RhYmlsaXR5XzEpICU+JQogIGRwbHlyOjp1bmdyb3VwKCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCgpmb3IgKHBsdF9pZCBpbiBuYW1lcyhwbHRfbHMpKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyBcblxuIiwgcGx0X2lkKSkKICBwbHQgPC0gcGx0X2xzW1twbHRfaWRdXQogIGlmIChwbHRfaWQgPT0gIlN1bW1hcnkiKSB7CiAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6bGFicyh5ID0gIkRydWciKQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdCwgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjY2xlX3JuYXNlcV9zdGFiaWxpdHlfdG9wMTAucGRmIiksIAogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLjUsIGhlaWdodCA9IGZpZ19oZWlnaHQgKiAxLjEpCiAgICB9IGVsc2UgewogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeSgKICAgICAgICBwbHQsIGkgPSBzcHJpbnRmKCIlcy0lcyIsIGZwYXRoLCBwbHRfaWQpLCAKICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zCiAgICAgICkKICAgIH0KICAgIAogICAgY2F0KCJcblxuIyMgVGFibGUgb2YgVG9wIEdlbmVzIFxuXG4iKQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgdG9wX2dlbmVzX2thYmxlIDwtIHRvcF9nZW5lc190YWJsZSAlPiUKICAgICAgICBkcGx5cjo6ZmlsdGVyKFJhbmsgPD0gNSkgJT4lCiAgICAgICAgZHBseXI6OnNlbGVjdCgtRHJ1ZykgJT4lCiAgICAgICAgZHBseXI6OnJlbmFtZSgiICIgPSAiUmFuayIpICU+JQogICAgICAgIHZ0aGVtZXM6OnByZXR0eV9rYWJsZShmb3JtYXQgPSAibGF0ZXgiLCBsb25ndGFibGUgPSBUUlVFKSAlPiUKICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpICU+JQogICAgICAgICMga2FibGVFeHRyYTo6Y29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMSwgdmFsaWduID0gIm1pZGRsZSIpCiAgICAgICAga2FibGVFeHRyYTo6cGFja19yb3dzKAogICAgICAgICAgaW5kZXggPSByZXAoNSwgMjQpICU+JSBzZXROYW1lcyh1bmlxdWUodG9wX2dlbmVzX3RhYmxlJERydWcpKQogICAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHRvcF9nZW5lc19rYWJsZSA8LSB0b3BfZ2VuZXNfdGFibGUgJT4lCiAgICAgICAgZHBseXI6OmZpbHRlcihSYW5rIDw9IDUpICU+JQogICAgICAgIGRwbHlyOjpzZWxlY3QoLURydWcpICU+JQogICAgICAgIGRwbHlyOjpyZW5hbWUoIiAiID0gIlJhbmsiKSAlPiUKICAgICAgICB2dGhlbWVzOjpwcmV0dHlfa2FibGUoKSAlPiUKICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpICU+JQogICAgICAgICMga2FibGVFeHRyYTo6Y29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMSwgdmFsaWduID0gIm1pZGRsZSIpCiAgICAgICAga2FibGVFeHRyYTo6cGFja19yb3dzKAogICAgICAgICAgaW5kZXggPSByZXAoNSwgMjQpICU+JSBzZXROYW1lcyh1bmlxdWUodG9wX2dlbmVzX3RhYmxlJERydWcpKQogICAgICAgICkKICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICAgICAgdG9wX2dlbmVzX2thYmxlLCBpID0gc3ByaW50ZigiJXMtdGFibGUiLCBmcGF0aCkKICAgICAgKQogICAgfQogIH0gZWxzZSBpZiAoIXBhcmFtcyRmb3JfcGFwZXIpIHsKICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KAogICAgICBwbG90X2Z1bihwbHQpLCBpID0gc3ByaW50ZigiJXMtJXMiLCBmcGF0aCwgcGx0X2lkKSwgCiAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMKICAgICkKICB9Cn0KYGBgCgpgYGB7ciBldmFsID0gVFJVRSwgcmVzdWx0cyA9ICJhc2lzIn0KaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICBtYW51YWxfY29sb3JfcGFsZXR0ZV9mdWxsIDwtIGMoImJsYWNrIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiMyMThhMWUiLCAiI2NjMzM5OSIpCiAgc2hvd19tZXRob2RzX2Z1bGwgPC0gYygiR01ESSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKQogIG1ldGhvZF9sYWJlbHNfZnVsbCA8LSBjKCJHTURJIChyaWRnZSkiLCAiTURBIiwgIk1ESSIsICJNREktb29iIiwgIlRyZWVTSEFQIikKICBrZWVwX21ldGhvZHNfbGlzdCA8LSBsaXN0KAogICAgYWxsID0gYygiR01ESSIsICJNREEiLCAiTURJIiwgIk1ESS1vb2IiLCAiVHJlZVNIQVAiKSwKICAgIG5vX21kaW9vYiA9IGMoIkdNREkiLCAiTURBIiwgIk1ESSIsICJUcmVlU0hBUCIpLAogICAgem9vbSA9IGMoIkdNREkiLCAiTURJIiwgIlRyZWVTSEFQIikKICApCiAgCiAgZnBhdGggPC0gImdtZGkucmVhbF9kYXRhX2Nhc2Vfc3R1ZHkuY2NsZV9ybmFzZXFfcmVncmVzc2lvbi0iCiAgZm5hbWUgPC0gZmlsZS5wYXRoKAogICAgcmVzdWx0c19kaXIsIAogICAgZnBhdGgsCiAgICBzcHJpbnRmKCJzZWVkJXMiLCBzZWVkKSwKICAgICJyZXN1bHRzLmNzdiIKICApCiAgWCA8LSBkYXRhLnRhYmxlOjpmcmVhZCgiL2dsb2JhbC9zY3JhdGNoL3VzZXJzL3RpZmZhbnl0YW5nL2ZlYXR1cmVfaW1wb3J0YW5jZS9kYXRhL1hfY2NsZV9ybmFzZXFfbG9nX3RyYW5zZm9ybWVkX2ZpbHRlcmVkNTAwMC5jc3YiKQogIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZm5hbWUpCiAgCiAgZm9yIChpZCBpbiBuYW1lcyhrZWVwX21ldGhvZHNfbGlzdCkpIHsKICAgIGtlZXBfbWV0aG9kcyA8LSBrZWVwX21ldGhvZHNfbGlzdFtbaWRdXQogICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gbWFudWFsX2NvbG9yX3BhbGV0dGVfZnVsbFtzaG93X21ldGhvZHNfZnVsbCAlaW4lIGtlZXBfbWV0aG9kc10KICAgIHNob3dfbWV0aG9kcyA8LSBzaG93X21ldGhvZHNfZnVsbFtzaG93X21ldGhvZHNfZnVsbCAlaW4lIGtlZXBfbWV0aG9kc10KICAgIG1ldGhvZF9sYWJlbHMgPC0gbWV0aG9kX2xhYmVsc19mdWxsW3Nob3dfbWV0aG9kc19mdWxsICVpbiUga2VlcF9tZXRob2RzXQogICAgCiAgICBwbHRfbHMgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogICAgICByZXN1bHRzLAogICAgICBncm91cF9pZCA9ICJ5X3Rhc2siLAogICAgICB0b3BfciA9IDEwLAogICAgICBzaG93X21heF9mZWF0dXJlcyA9IDUsCiAgICAgIHZhcm5hbWVzID0gY29sbmFtZXMoWCksCiAgICAgIGJhc2VfbWV0aG9kID0gIkdNREkiLAogICAgICByZXR1cm5fZGYgPSBGQUxTRSwKICAgICAgZGVzY2VuZGluZ19tZXRob2RzID0gTlVMTCwKICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscwogICAgKQogICAgCiAgICBpZiAoaWQgPT0gIm5vX21kaW9vYiIpIHsKICAgICAga2VlcF9kcnVncyA8LSBjKCJQYW5vYmlub3N0YXQiLCAiTGFwYXRpbmliIiwgIlRBRTY4NCIsICJMLTY4NTQ1OCIpCiAgICAgIHNtYWxsX3BsdF9scyA8LSBsaXN0KCkKICAgICAgZm9yIChkcnVnIGluIGtlZXBfZHJ1Z3MpIHsKICAgICAgICBwbHQgPC0gcGx0X2xzW1tkcnVnXV0KICAgICAgICBpZiAoZHJ1ZyAhPSBrZWVwX2RydWdzWzFdKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBzbWFsbF9wbHRfbHNbW2RydWddXSA8LSBwbHQKICAgICAgfQogICAgICBzbWFsbF9wbHRfbHNbWzFdXSArIHNtYWxsX3BsdF9sc1tbMl1dICsgc21hbGxfcGx0X2xzW1szXV0gKyBzbWFsbF9wbHRfbHNbWzRdXSArCiAgICAgICAgcGF0Y2h3b3JrOjpwbG90X2xheW91dChucm93ID0gMSwgbmNvbCA9IDQsIGd1aWRlcyA9ICJjb2xsZWN0IikKICAgICAgcGx0IDwtIHBhdGNod29yazo6d3JhcF9wbG90cyhzbWFsbF9wbHRfbHMsIG5yb3cgPSAxLCBuY29sID0gNCwgZ3VpZGVzID0gImNvbGxlY3QiKSAmCiAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBnZ3Bsb3QyOjplbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5OTUiLCBzaXplID0gZ2dwbG90Mjo6cmVsKDAuMjUpKQogICAgICAgICkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdCwgZmlsZW5hbWUgPSBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJjY2xlX3JuYXNlcV9zdGFiaWxpdHlfc2VsZWN0X2ZlYXR1cmVzLnBkZiIpLAogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogMC41KQogICAgfSBlbHNlIHsKICAgICAgYWxsX3BsdF9scyA8LSBsaXN0KCkKICAgICAgZm9yIChpZHggaW4gMTpsZW5ndGgodW5pcXVlKHJlc3VsdHMkeV90YXNrKSkpIHsKICAgICAgICBkcnVnIDwtIHNvcnQodW5pcXVlKHJlc3VsdHMkeV90YXNrKSlbaWR4XQogICAgICAgIHBsdCA8LSBwbHRfbHNbW2RydWddXQogICAgICAgIGlmICgoaWR4IC0gMSkgJSUgNCAhPSAwKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgIH0KICAgICAgICBpZiAoKGlkeCAtIDEpICUvJSA0ICE9IDUpIHsKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfQogICAgICAgIGFsbF9wbHRfbHNbW2RydWddXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKGFsbF9wbHRfbHMsIGd1aWRlcyA9ICJjb2xsZWN0IiwgbmNvbCA9IDQsIG5yb3cgPSA2KSAmCiAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICBwbG90LnRpdGxlID0gZ2dwbG90Mjo6ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBnZ3Bsb3QyOjplbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGdncGxvdDI6OmVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5OTUiLCBzaXplID0gZ2dwbG90Mjo6cmVsKDAuMjUpKQogICAgICAgICkKICAgICAgZ2dwbG90Mjo6Z2dzYXZlKHBsdCwgCiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUucGF0aChmaWd1cmVzX2RpciwgImFwcGVuZGl4Iiwgc3ByaW50ZigiY2NsZV9ybmFzZXFfc3RhYmlsaXR5X3NlbGVjdF9mZWF0dXJlc18lcy5wZGYiLCBpZCkpLAogICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmaWdfd2lkdGggKiAxLCBoZWlnaHQgPSBmaWdfaGVpZ2h0ICogMikKICAgIH0KICB9Cn0KCmBgYAoKCiMgVENHQSBCUkNBIENhc2UgU3R1ZHkgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjKCJibGFjayIsICIjOUI1REZGIiwgIm9yYW5nZSIsICIjNzFiZWI3IiwgIiNjYzMzOTkiKQpzaG93X21ldGhvZHMgPC0gYygiR01ESV9yaWRnZSIsICJHTURJX2xvZ2lzdGljX2xvZ2xvc3MiLCAiTURBIiwgIk1ESSIsICJUcmVlU0hBUCIpCm1ldGhvZF9sYWJlbHMgPC0gYygiR01ESSAocmlkZ2UpIiwgIkdNREkgKGxvZ2lzdGljKSIsICJNREEiLCAiTURJIiwgIlRyZWVTSEFQIikKCmZwYXRoIDwtICJnbWRpLnJlYWxfZGF0YV9jYXNlX3N0dWR5LnRjZ2FfYnJjYV9jbGFzc2lmaWNhdGlvbi0iCmZuYW1lIDwtIGZpbGUucGF0aCgKICByZXN1bHRzX2RpciwgCiAgZnBhdGgsCiAgc3ByaW50Zigic2VlZCVzIiwgc2VlZCksCiAgInJlc3VsdHMuY3N2IgopClggPC0gZGF0YS50YWJsZTo6ZnJlYWQoIi9nbG9iYWwvc2NyYXRjaC91c2Vycy90aWZmYW55dGFuZy9mZWF0dXJlX2ltcG9ydGFuY2UvZGF0YS9YX3RjZ2FfdmFyX2ZpbHRlcmVkX2xvZ190cmFuc2Zvcm1lZC5jc3YiKQpyZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKGZuYW1lKQpvdXQgPC0gcGxvdF90b3Bfc3RhYmlsaXR5KAogIHJlc3VsdHMsCiAgZ3JvdXBfaWQgPSBOVUxMLAogIHRvcF9yID0gMTAsCiAgc2hvd19tYXhfZmVhdHVyZXMgPSAyMCwKICB2YXJuYW1lcyA9IGNvbG5hbWVzKFgpLAogIGJhc2VfbWV0aG9kID0gIkdNREkgKHJpZGdlKSIsIAogIHJldHVybl9kZiA9IFRSVUUsCiAgZGVzY2VuZGluZ19tZXRob2RzID0gIkdNREkgKGxvZ2lzdGljKSIsCiAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMKKQoKcmFua2luZ19kZiA8LSBvdXQkcmFua2luZ3MKc3RhYmlsaXR5X2RmIDwtIG91dCRzdGFiaWxpdHkKcGx0X2xzIDwtIG91dCRwbG90X2xzCgpjYXQoIlxuXG4jIyBOb24temVybyBTdGFiaWxpdHkgU2NvcmVzIFBlciBNZXRob2RcblxuIikKdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgcGx0X2xzW1sxXV0sIGkgPSBzcHJpbnRmKCIlcy0lcyIsIGZwYXRoLCAxKSwgCiAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQgKiByb3VuZChsZW5ndGgodW5pcXVlKHJlc3VsdHMkZmkpKSAvIDIpLCBmaWdfd2lkdGggPSBmaWdfd2lkdGgKKQoKY2F0KCJcblxuIyMgU3RhYmlsaXR5IG9mIFRvcCBGZWF0dXJlc1xuXG4iKQp2dGhlbWVzOjpzdWJjaHVua2lmeSgKICBwbG90X2Z1bihwbHRfbHNbWzJdXSksIGkgPSBzcHJpbnRmKCIlcy0lcyIsIGZwYXRoLCAyKSwgCiAgZmlnX2hlaWdodCA9IGZpZ19oZWlnaHQsIGZpZ193aWR0aCA9IGZpZ193aWR0aAopCgojIGdldCB0b3AgMTAgZ2VuZXMKdG9wX2dlbmVzIDwtIHJhbmtpbmdfZGYgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGZpLCB2YXIpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UobWVhbl9yYW5rID0gbWVhbihyYW5rKSkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICBkcGx5cjo6YXJyYW5nZShtZWFuX3JhbmspICU+JQogIGRwbHlyOjpncm91cF9ieShmaSkgJT4lCiAgZHBseXI6Om11dGF0ZShyYW5rID0gMTpkcGx5cjo6bigpKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpCgp0b3BfZ2VuZXNfdGFibGUgPC0gdG9wX2dlbmVzICU+JQogIGRwbHlyOjpmaWx0ZXIocmFuayA8PSAxMCkgJT4lCiAgZHBseXI6OmxlZnRfam9pbigKICAgIHkgPSBkYXRhLmZyYW1lKHZhciA9IDA6KG5jb2woWCkgLSAxKSwgCiAgICAgICAgICAgICAgICAgICBnZW5lID0gY29sbmFtZXMoWCkpLAogICAgYnkgPSAidmFyIgogICkgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIHZhbHVlID0gc3ByaW50ZigiJXMgKCVzKSIsIGdlbmUsIHJvdW5kKG1lYW5fcmFuaywgMikpCiAgKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIoCiAgICBpZF9jb2xzID0gcmFuaywgCiAgICBuYW1lc19mcm9tID0gZmksIAogICAgdmFsdWVzX2Zyb20gPSB2YWx1ZQogICkgJT4lCiAgZHBseXI6OnJlbmFtZSgKICAgICJSYW5rIiA9ICJyYW5rIgogICkKCiMgd3JpdGUuY3N2KAojICAgdG9wX2dlbmVzX3RhYmxlLCBmaWxlLnBhdGgodGFibGVzX2RpciwgInRjZ2FfdG9wX2dlbmVzX3RhYmxlLmNzdiIpLAojICAgcm93Lm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UKIyApCgpjYXQoIlxuXG4jIyBUYWJsZSBvZiBUb3AgR2VuZXMgXG5cbiIpCmlmIChwYXJhbXMkZm9yX3BhcGVyKSB7CiAgdG9wX2dlbmVzX2thYmxlIDwtIHRvcF9nZW5lc190YWJsZSAlPiUKICAgIHZ0aGVtZXM6OnByZXR0eV9rYWJsZShmb3JtYXQgPSAibGF0ZXgiLCBsb25ndGFibGUgPSBUUlVFKSAlPiUKICAgIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9ICJyZXBlYXRfaGVhZGVyIikKfSBlbHNlIHsKICB0b3BfZ2VuZXNfa2FibGUgPC0gdG9wX2dlbmVzX3RhYmxlICU+JQogICAgdnRoZW1lczo6cHJldHR5X2thYmxlKCkgJT4lCiAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSAicmVwZWF0X2hlYWRlciIpCiAgdnRoZW1lczo6c3ViY2h1bmtpZnkoCiAgICB0b3BfZ2VuZXNfa2FibGUsIGkgPSBzcHJpbnRmKCIlcy10YWJsZSIsIGZwYXRoKQogICkKfQpgYGAKCgojIE1pc3NwZWNpZmllZCBNb2RlbHMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjM1KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiLCAic3BsaWNpbmciKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiLCAianV2ZW5pbGUiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsc3NfM21fMnIiLCAiaGllcl9wb2x5XzNtXzJyIiwgImxpbmVhcl9sc3NfM21fMnIiKQoKZm9yICh5X21vZGVsIGluIHlfbW9kZWxzKSB7CiAgY2F0KHNwcmludGYoIlxuXG4jIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtc3F1YXJlfVxuXG4iLCB5X21vZGVsKSkKICBmb3IgKHhfbW9kZWwgaW4geF9tb2RlbHMpIHsKICAgIGNhdChzcHJpbnRmKCJcblxuIyMjICVzIFxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncF9vbWl0dGVkX3ZhcnMiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICApCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgiZ21kaS5yZWdyZXNzaW9uX3NpbXMuIiwgc2ltX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJzZWVkIiwgc2VlZCksICJyZXN1bHRzIikKICAgIGlmIChmaWxlLmV4aXN0cyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpICYgcGFyYW1zJHVzZV9jYWNoZWQpIHsKICAgICAgcmVzdWx0cyA8LSByZWFkUkRTKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICAgIHJlZm9ybWF0X3Jlc3VsdHMoKQogICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgfQogICAgaWYgKHBhcmFtcyRmb3JfcGFwZXIpIHsKICAgICAgZm9yIChoIGluIGhlcml0YWJpbGl0aWVzKSB7CiAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGhlcml0YWJpbGl0eSA9PSAhIWgpICU+JQogICAgICAgICAgcGxvdF9tZXRyaWNzKAogICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgIHhfc3RyID0gInNhbXBsZV9yb3dfbiIsCiAgICAgICAgICAgIGZhY2V0X3N0ciA9IE5VTEwsCiAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemUsCiAgICAgICAgICAgIGVycmJhcl93aWR0aCA9IGVycmJhcl93aWR0aCwKICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgc2hvd19tZXRob2RzID0gc2hvd19tZXRob2RzLAogICAgICAgICAgICBtZXRob2RfbGFiZWxzID0gbWV0aG9kX2xhYmVscywKICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICBsZWdlbmRfcG9zaXRpb24gPSBsZWdlbmRfcG9zaXRpb24sCiAgICAgICAgICAgIGN1c3RvbV90aGVtZSA9IGN1c3RvbV90aGVtZSwKICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICkgKwogICAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJtaXNzcGVjaWZpZWRfcmVncmVzc2lvbl9zaW1zXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICBjb2xvciA9ICJNZXRob2QiLCBhbHBoYSA9ICJNZXRob2QiLAogICAgICAgICAgdGl0bGUgPSBzcHJpbnRmKCIlcyIsIHNpbV90aXRsZSkKICAgICAgICApCiAgICAgIHZ0aGVtZXM6OnN1YmNodW5raWZ5KHBsb3RfZnVuKHBsdCksIGkgPSBjaHVua19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19oZWlnaHQgPSBmaWdfaGVpZ2h0LCBmaWdfd2lkdGggPSBmaWdfd2lkdGggKiAxLjMpCiAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICB9CiAgfQp9CgpgYGAKCgojIFZhcnlpbmcgU3BhcnNpdHkgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9CmtlZXBfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lICVpbiUgYygiR01ESV9yaWRnZV9SRiIsICJNREFfUkYiLCAiTURJX1JGIiwgIk1ESS1vb2JfUkYiLCAiVHJlZVNIQVBfUkYiKQptYW51YWxfY29sb3JfcGFsZXR0ZSA8LSBjb2xvcl9kZiRjb2xvcltrZWVwX21ldGhvZHNdCnNob3dfbWV0aG9kcyA8LSBjb2xvcl9kZiRuYW1lW2tlZXBfbWV0aG9kc10KbWV0aG9kX2xhYmVscyA8LSBjb2xvcl9kZiRsYWJlbFtrZWVwX21ldGhvZHNdCmFscGhhX3ZhbHVlcyA8LSBjKDEsIHJlcCgwLjQsIGxlbmd0aChtZXRob2RfbGFiZWxzKSAtIDEpKQpsZWdlbmRfcG9zaXRpb24gPC0gYygwLjczLCAwLjcpCgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygianV2ZW5pbGUiLCAic3BsaWNpbmciKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygic3BsaWNpbmciKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJzcGxpY2luZyIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIsICJsaW5lYXJfbHNzXzNtXzJyIikKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyBcblxuIiwgeF9tb2RlbCkpCiAgICBwbHRfbHMgPC0gbGlzdCgpCiAgICBzaW1fbmFtZSA8LSBzcHJpbnRmKCIlc18lc19kZ3AiLCB4X21vZGVsLCB5X21vZGVsKQogICAgc2ltX3RpdGxlIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgeF9tb2RlbCA9PSAic3BsaWNpbmciIH4gIlNwbGljaW5nIiwKICAgICAgeF9tb2RlbCA9PSAiZW5oYW5jZXIiIH4gIkVuaGFuY2VyIiwKICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgKQogICAgbWV0cmljX25hbWUgPC0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgbWV0cmljID09ICJwcmF1YyIgfiAiUFJBVUMiCiAgICApCiAgICB4X3N0ciA8LSBpZmVsc2UoeV9tb2RlbCA9PSAibGluZWFyIiwgInMiLCAibSIpCiAgICB2YXJ5X3BhcmFtX25hbWUgPC0gc3ByaW50ZigiaGVyaXRhYmlsaXR5XyVzIiwgeF9zdHIpCiAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIHBhc3RlMCgiZ21kaS5vdGhlcl9yZWdyZXNzaW9uX3NpbXMudmFyeWluZ19zcGFyc2l0eS4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSB4X3N0ciwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gdG91cHBlcih4X3N0ciksIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJyZWdyZXNzaW9uX3NpbXNfc3BhcnNpdHlfJXNfJXNfJXNfZXJyYmFycy5wZGYiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlfbW9kZWwsIHhfbW9kZWwsIG1ldHJpYykpLAogICAgICAgIHBsb3QgPSBwbHQsIHVuaXRzID0gImluIiwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gMwogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9IHhfc3RyLAogICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSB0b3VwcGVyKHhfc3RyKSwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQoKYGBgCgoKIyBWYXJ5aW5nIFwjIEZlYXR1cmVzIHsudGFic2V0IC50YWJzZXQtdm1vZGVybn0KCmBgYHtyIGV2YWwgPSBUUlVFLCByZXN1bHRzID0gImFzaXMifQprZWVwX21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZSAlaW4lIGMoIkdNRElfcmlkZ2VfUkYiLCAiTURBX1JGIiwgIk1ESV9SRiIsICJNREktb29iX1JGIiwgIlRyZWVTSEFQX1JGIikKbWFudWFsX2NvbG9yX3BhbGV0dGUgPC0gY29sb3JfZGYkY29sb3Jba2VlcF9tZXRob2RzXQpzaG93X21ldGhvZHMgPC0gY29sb3JfZGYkbmFtZVtrZWVwX21ldGhvZHNdCm1ldGhvZF9sYWJlbHMgPC0gY29sb3JfZGYkbGFiZWxba2VlcF9tZXRob2RzXQphbHBoYV92YWx1ZXMgPC0gYygxLCByZXAoMC40LCBsZW5ndGgobWV0aG9kX2xhYmVscykgLSAxKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC43MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX2NvbF9uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAibHNzXzNtXzJyIiwgImhpZXJfcG9seV8zbV8yciIsICJsaW5lYXJfbHNzXzNtXzJyIikKeF9tb2RlbHMgPC0gYygiY2NsZV9ybmFzZXEiKQoKcmVtb3ZlX3hfYXhpc19tb2RlbHMgPC0gYygibGluZWFyIiwgImxzc18zbV8yciIsICJoaWVyX3BvbHlfM21fMnIiKQprZWVwX2xlZ2VuZF94X21vZGVscyA8LSBjKCJjY2xlX3JuYXNlcSIpCmtlZXBfbGVnZW5kX3lfbW9kZWxzIDwtIGMoImxpbmVhciIpCgpmb3IgKHlfbW9kZWwgaW4geV9tb2RlbHMpIHsKICBjYXQoc3ByaW50ZigiXG5cbiMjICVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLnRhYnNldC1zcXVhcmV9XG5cbiIsIHlfbW9kZWwpKQogIGZvciAoeF9tb2RlbCBpbiB4X21vZGVscykgewogICAgY2F0KHNwcmludGYoIlxuXG4jIyMgJXMgXG5cbiIsIHhfbW9kZWwpKQogICAgcGx0X2xzIDwtIGxpc3QoKQogICAgc2ltX25hbWUgPC0gc3ByaW50ZigiJXNfJXNfZGdwIiwgeF9tb2RlbCwgeV9tb2RlbCkKICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICB4X21vZGVsID09ICJjY2xlX3JuYXNlcSIgfiAiQ0NMRSIsCiAgICAgIHhfbW9kZWwgPT0gInNwbGljaW5nIiB+ICJTcGxpY2luZyIsCiAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgIHhfbW9kZWwgPT0gImp1dmVuaWxlIiB+ICJKdXZlbmlsZSIKICAgICkKICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgIG1ldHJpYyA9PSAicm9jYXVjIiB+ICJBVVJPQyIsCiAgICAgIG1ldHJpYyA9PSAicHJhdWMiIH4gIlBSQVVDIgogICAgKQogICAgZm5hbWUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCBwYXN0ZTAoImdtZGkub3RoZXJfcmVncmVzc2lvbl9zaW1zLnZhcnlpbmdfcC4iLCBzaW1fbmFtZSksIAogICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMCgidmFyeWluZ18iLCB2YXJ5X3BhcmFtX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICByZXN1bHRzIDwtIHJlYWRSRFMoc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICBpZiAobGVuZ3RoKHNldGRpZmYoc2hvd19tZXRob2RzLCB1bmlxdWUocmVzdWx0cyRtZXRob2QpKSkgPiAwKSB7CiAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgcmVmb3JtYXRfcmVzdWx0cygpCiAgICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdHMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoc3ByaW50ZigiJXMuY3N2IiwgZm5hbWUpKSAlPiUKICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgc2F2ZVJEUyhyZXN1bHRzLCBzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICB9CiAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICBmb3IgKGggaW4gaGVyaXRhYmlsaXRpZXMpIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICAgIG1ldHJpYyA9IG1ldHJpYywKICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX2NvbF9uIiwKICAgICAgICAgICAgZmFjZXRfc3RyID0gTlVMTCwKICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IHBvaW50X3NpemUsCiAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgICBtYW51YWxfY29sb3JfcGFsZXR0ZSA9IG1hbnVhbF9jb2xvcl9wYWxldHRlLAogICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgICBhbHBoYV92YWx1ZXMgPSBhbHBoYV92YWx1ZXMsCiAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lLAogICAgICAgICAgICBpbnNpZGVfbGVnZW5kID0gVFJVRQogICAgICAgICAgKSArCiAgICAgICAgICBnZ3Bsb3QyOjpsYWJzKAogICAgICAgICAgICB4ID0gIk51bWJlciBvZiBGZWF0dXJlcyIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIKICAgICAgICAgICkKICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgcGx0IDwtIHBsdCArIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueSA9IGdncGxvdDI6OmVsZW1lbnRfYmxhbmsoKSkKICAgICAgICB9CiAgICAgICAgaWYgKHlfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgaGVpZ2h0IDwtIDIuNzIKICAgICAgICAgIHBsdCA8LSBwbHQgKyBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCkpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA8LSAzCiAgICAgICAgfQogICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICh4X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeF9tb2RlbHMpICYgCiAgICAgICAgICAgICAgKHlfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF95X21vZGVscykpKSB7CiAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICB9CiAgICAgICAgcGx0X2xzW1thcy5jaGFyYWN0ZXIoaCldXSA8LSBwbHQKICAgICAgfQogICAgICBwbHQgPC0gcGF0Y2h3b3JrOjp3cmFwX3Bsb3RzKHBsdF9scywgbnJvdyA9IDEpCiAgICAgIGdncGxvdDI6Omdnc2F2ZSgKICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsIAogICAgICAgICAgICAgICAgICBzcHJpbnRmKCJyZWdyZXNzaW9uX3NpbXNfdmFyeV9wXyVzXyVzXyVzX2VycmJhcnMucGRmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB5X21vZGVsLCB4X21vZGVsLCBtZXRyaWMpKSwKICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICApCiAgICB9IGVsc2UgewogICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICBwbG90X21ldHJpY3MoCiAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfY29sX24iLAogICAgICAgICAgZmFjZXRfc3RyID0gImhlcml0YWJpbGl0eV9uYW1lIiwKICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgZXJyYmFyX3dpZHRoID0gZXJyYmFyX3dpZHRoLAogICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgIG1ldGhvZF9sYWJlbHMgPSBtZXRob2RfbGFiZWxzLAogICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgKSArCiAgICAgICAgZ2dwbG90Mjo6bGFicygKICAgICAgICAgIHggPSAiTnVtYmVyIG9mIEZlYXR1cmVzIiwgeSA9IG1ldHJpY19uYW1lLAogICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIiwKICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgKQogICAgICB2dGhlbWVzOjpzdWJjaHVua2lmeShwbG90X2Z1bihwbHQpLCBpID0gY2h1bmtfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICBjaHVua19pZHggPC0gY2h1bmtfaWR4ICsgMQogICAgfQogIH0KfQoKYGBgCgoKIyBHTURJIE1vZGVsaW5nIENob2ljZXMgey50YWJzZXQgLnRhYnNldC12bW9kZXJufQoKYGBge3IgZXZhbCA9IFRSVUUsIHJlc3VsdHMgPSAiYXNpcyJ9Cm1hbnVhbF9jb2xvcl9wYWxldHRlIDwtIGMobWFudWFsX2NvbG9yX3BhbGV0dGVfY2hvaWNlc1ttZXRob2RfbGFiZWxzX2Nob2ljZXMgPT0gIk1ESSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlX2Nob2ljZXNbbWV0aG9kX2xhYmVsc19jaG9pY2VzID09ICJNREktb29iIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiNBRjREOTgiLCAiI0ZGRDkyRiIsICIjRkM4RDYyIiwgImJsYWNrIikKc2hvd19tZXRob2RzIDwtIGMoIk1ESV9SRiIsICJNREktb29iX1JGIiwgIkdNRElfcmF3X1JGIiwgIkdNRElfbG9vX1JGIiwgIkdNRElfb2xzX3Jhd19sb29fUkYiLCAiR01ESV9yaWRnZV9yYXdfbG9vX1JGIikKbWV0aG9kX2xhYmVscyA8LSBjKCJNREkiLCAiTURJLW9vYiIsICJHTURJIChyYXcgb25seSkiLCAiR01ESSAobG9vIG9ubHkpIiwgIkdNREkgKHJhdytsb28gb25seSkiLCAiR01ESSAocmlkZ2UrcmF3K2xvbykiKQphbHBoYV92YWx1ZXMgPC0gcmVwKDEsIGxlbmd0aChtZXRob2RfbGFiZWxzKSkKbGVnZW5kX3Bvc2l0aW9uIDwtIGMoMC42MywgMC40KQoKdmFyeV9wYXJhbV9uYW1lIDwtICJoZXJpdGFiaWxpdHlfc2FtcGxlX3Jvd19uIgp5X21vZGVscyA8LSBjKCJsaW5lYXIiLCAiaGllcl9wb2x5XzNtXzJyIikKeF9tb2RlbHMgPC0gYygiZW5oYW5jZXIiLCAiY2NsZV9ybmFzZXEiKSMsICJzcGxpY2luZyIpCm1pbl9zYW1wbGVzX3Blcl9sZWFmcyA8LSBjKDUsIDEpCgpyZW1vdmVfeF9heGlzX21vZGVscyA8LSBjKCJlbmhhbmNlciIpCmtlZXBfbGVnZW5kX3hfbW9kZWxzIDwtIGMoImVuaGFuY2VyIikKa2VlcF9sZWdlbmRfeV9tb2RlbHMgPC0gYygibGluZWFyIikKCmZvciAoeV9tb2RlbCBpbiB5X21vZGVscykgewogIGNhdChzcHJpbnRmKCJcblxuIyMgJXMgey50YWJzZXQgLnRhYnNldC1waWxscyAudGFic2V0LXNxdWFyZX1cblxuIiwgeV9tb2RlbCkpCiAgZm9yICh4X21vZGVsIGluIHhfbW9kZWxzKSB7CiAgICBjYXQoc3ByaW50ZigiXG5cbiMjIyAlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC50YWJzZXQtY2lyY2xlfVxuXG4iLCB4X21vZGVsKSkKICAgIHBsdF9scyA8LSBsaXN0KCkKICAgIGZvciAobWluX3NhbXBsZXNfcGVyX2xlYWYgaW4gbWluX3NhbXBsZXNfcGVyX2xlYWZzKSB7CiAgICAgIGNhdChzcHJpbnRmKCJcblxuIyMjIyBtaW5fc2FtcGxlc19wZXJfbGVhZiA9ICVzIFxuXG4iLCBtaW5fc2FtcGxlc19wZXJfbGVhZikpCiAgICAgIHNpbV9uYW1lIDwtIHNwcmludGYoIiVzXyVzX2RncCIsIHhfbW9kZWwsIHlfbW9kZWwpCiAgICAgIHNpbV90aXRsZSA8LSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgIHhfbW9kZWwgPT0gImNjbGVfcm5hc2VxIiB+ICJDQ0xFIiwKICAgICAgICB4X21vZGVsID09ICJzcGxpY2luZyIgfiAiU3BsaWNpbmciLAogICAgICAgIHhfbW9kZWwgPT0gImVuaGFuY2VyIiB+ICJFbmhhbmNlciIsCiAgICAgICAgeF9tb2RlbCA9PSAianV2ZW5pbGUiIH4gIkp1dmVuaWxlIgogICAgICApCiAgICAgIG1ldHJpY19uYW1lIDwtIGRwbHlyOjpjYXNlX3doZW4oCiAgICAgICAgbWV0cmljID09ICJyb2NhdWMiIH4gIkFVUk9DIiwKICAgICAgICBtZXRyaWMgPT0gInByYXVjIiB+ICJQUkFVQyIKICAgICAgKQogICAgICBmbmFtZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiZ21kaS5vdGhlcl9yZWdyZXNzaW9uX3NpbXMubW9kZWxpbmdfY2hvaWNlc19taW5fc2FtcGxlcyVzLiVzIiwgbWluX3NhbXBsZXNfcGVyX2xlYWYsIHNpbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInZhcnlpbmdfIiwgdmFyeV9wYXJhbV9uYW1lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoInNlZWQiLCBzZWVkKSwgInJlc3VsdHMiKQogICAgICBpZiAoIWZpbGUuZXhpc3RzKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkpIHsKICAgICAgICBuZXh0CiAgICAgIH0KICAgICAgaWYgKGZpbGUuZXhpc3RzKHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkgJiBwYXJhbXMkdXNlX2NhY2hlZCkgewogICAgICAgIHJlc3VsdHMgPC0gcmVhZFJEUyhzcHJpbnRmKCIlcy5yZHMiLCBmbmFtZSkpCiAgICAgICAgaWYgKGxlbmd0aChzZXRkaWZmKHNob3dfbWV0aG9kcywgdW5pcXVlKHJlc3VsdHMkbWV0aG9kKSkpID4gMCkgewogICAgICAgICAgcmVzdWx0cyA8LSBkYXRhLnRhYmxlOjpmcmVhZChzcHJpbnRmKCIlcy5jc3YiLCBmbmFtZSkpICU+JQogICAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICAgIHNhdmVSRFMocmVzdWx0cywgc3ByaW50ZigiJXMucmRzIiwgZm5hbWUpKQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRzIDwtIGRhdGEudGFibGU6OmZyZWFkKHNwcmludGYoIiVzLmNzdiIsIGZuYW1lKSkgJT4lCiAgICAgICAgICByZWZvcm1hdF9yZXN1bHRzKCkKICAgICAgICBzYXZlUkRTKHJlc3VsdHMsIHNwcmludGYoIiVzLnJkcyIsIGZuYW1lKSkKICAgICAgfQogICAgICBpZiAocGFyYW1zJGZvcl9wYXBlcikgewogICAgICAgIGZvciAoaCBpbiBoZXJpdGFiaWxpdGllcykgewogICAgICAgICAgcGx0IDwtIHJlc3VsdHMgJT4lCiAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoaGVyaXRhYmlsaXR5ID09ICEhaCkgJT4lCiAgICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgICBtZXRyaWMgPSBtZXRyaWMsCiAgICAgICAgICAgICAgeF9zdHIgPSAic2FtcGxlX3Jvd19uIiwKICAgICAgICAgICAgICBmYWNldF9zdHIgPSBOVUxMLAogICAgICAgICAgICAgIHBvaW50X3NpemUgPSBwb2ludF9zaXplLAogICAgICAgICAgICAgIGxpbmVfc2l6ZSA9IGxpbmVfc2l6ZSwKICAgICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgICAgbWFudWFsX2NvbG9yX3BhbGV0dGUgPSBtYW51YWxfY29sb3JfcGFsZXR0ZSwKICAgICAgICAgICAgICBzaG93X21ldGhvZHMgPSBzaG93X21ldGhvZHMsCiAgICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgICAgYWxwaGFfdmFsdWVzID0gYWxwaGFfdmFsdWVzLAogICAgICAgICAgICAgIGxlZ2VuZF9wb3NpdGlvbiA9IGxlZ2VuZF9wb3NpdGlvbiwKICAgICAgICAgICAgICBjdXN0b21fdGhlbWUgPSBjdXN0b21fdGhlbWUsCiAgICAgICAgICAgICAgaW5zaWRlX2xlZ2VuZCA9IFRSVUUKICAgICAgICAgICAgKSArCiAgICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgICAgeCA9ICJTYW1wbGUgU2l6ZSIsIHkgPSBtZXRyaWNfbmFtZSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiTWV0aG9kIiwgYWxwaGEgPSAiTWV0aG9kIgogICAgICAgICAgICApICsKICAgICAgICAgICAgZ2dwbG90Mjo6dGhlbWUoCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDEyKQogICAgICAgICAgICApCiAgICAgICAgICBpZiAoaCAhPSBoZXJpdGFiaWxpdGllc1sxXSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfQogICAgICAgICAgaWYgKHhfbW9kZWwgJWluJSByZW1vdmVfeF9heGlzX21vZGVscykgewogICAgICAgICAgICBoZWlnaHQgPC0gMi43MgogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpKQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVpZ2h0IDwtIDMKICAgICAgICAgIH0KICAgICAgICAgIGlmICghKChoID09IGhlcml0YWJpbGl0aWVzW2xlbmd0aChoZXJpdGFiaWxpdGllcyldKSAmIAogICAgICAgICAgICAgICAgKHhfbW9kZWwgJWluJSBrZWVwX2xlZ2VuZF94X21vZGVscykgJiAKICAgICAgICAgICAgICAgICh5X21vZGVsICVpbiUga2VlcF9sZWdlbmRfeV9tb2RlbHMpKSkgewogICAgICAgICAgICBwbHQgPC0gcGx0ICsgZ2dwbG90Mjo6Z3VpZGVzKGNvbG9yID0gIm5vbmUiLCBhbHBoYSA9ICJub25lIikKICAgICAgICAgIH0KICAgICAgICAgIHBsdF9sc1tbYXMuY2hhcmFjdGVyKGgpXV0gPC0gcGx0CiAgICAgICAgfQogICAgICAgIHBsdCA8LSBwYXRjaHdvcms6OndyYXBfcGxvdHMocGx0X2xzLCBucm93ID0gMSkKICAgICAgICBnZ3Bsb3QyOjpnZ3NhdmUoCiAgICAgICAgICBmaWxlLnBhdGgoZmlndXJlc19kaXIsICJhcHBlbmRpeCIsCiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigicmVncmVzc2lvbl9zaW1zX2Nob2ljZXNfbWluX3NhbXBsZXMlc18lc18lc18lc19lcnJiYXJzLnBkZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2FtcGxlc19wZXJfbGVhZiwgeV9tb2RlbCwgeF9tb2RlbCwgbWV0cmljKSksCiAgICAgICAgICBwbG90ID0gcGx0LCB1bml0cyA9ICJpbiIsIHdpZHRoID0gMTQsIGhlaWdodCA9IGhlaWdodAogICAgICAgICkKICAgICAgfSBlbHNlIHsKICAgICAgICBwbHQgPC0gcmVzdWx0cyAlPiUKICAgICAgICAgIHBsb3RfbWV0cmljcygKICAgICAgICAgICAgbWV0cmljID0gbWV0cmljLAogICAgICAgICAgICB4X3N0ciA9ICJzYW1wbGVfcm93X24iLAogICAgICAgICAgICBmYWNldF9zdHIgPSAiaGVyaXRhYmlsaXR5X25hbWUiLAogICAgICAgICAgICBwb2ludF9zaXplID0gcG9pbnRfc2l6ZSwKICAgICAgICAgICAgbGluZV9zaXplID0gbGluZV9zaXplLAogICAgICAgICAgICBlcnJiYXJfd2lkdGggPSBlcnJiYXJfd2lkdGgsCiAgICAgICAgICAgIG1hbnVhbF9jb2xvcl9wYWxldHRlID0gbWFudWFsX2NvbG9yX3BhbGV0dGUsCiAgICAgICAgICAgIHNob3dfbWV0aG9kcyA9IHNob3dfbWV0aG9kcywKICAgICAgICAgICAgbWV0aG9kX2xhYmVscyA9IG1ldGhvZF9sYWJlbHMsCiAgICAgICAgICAgIGFscGhhX3ZhbHVlcyA9IGFscGhhX3ZhbHVlcywKICAgICAgICAgICAgY3VzdG9tX3RoZW1lID0gY3VzdG9tX3RoZW1lCiAgICAgICAgICApICsKICAgICAgICAgIGdncGxvdDI6OmxhYnMoCiAgICAgICAgICAgIHggPSAiU2FtcGxlIFNpemUiLCB5ID0gbWV0cmljX25hbWUsCiAgICAgICAgICAgIGNvbG9yID0gIk1ldGhvZCIsIGFscGhhID0gIk1ldGhvZCIsCiAgICAgICAgICAgIHRpdGxlID0gc3ByaW50ZigiJXMiLCBzaW1fdGl0bGUpCiAgICAgICAgICApCiAgICAgICAgdnRoZW1lczo6c3ViY2h1bmtpZnkocGxvdF9mdW4ocGx0KSwgaSA9IGNodW5rX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWdfaGVpZ2h0ID0gZmlnX2hlaWdodCwgZmlnX3dpZHRoID0gZmlnX3dpZHRoICogMS4zKQogICAgICAgIGNodW5rX2lkeCA8LSBjaHVua19pZHggKyAxCiAgICAgIH0KICAgIH0KICB9Cn0KCmBgYAoK